Module: Validatr::Verhoeff

Extended by:
Utils
Defined in:
lib/validatr/verhoeff.rb

Constant Summary collapse

D =
[
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
  [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
  [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
  [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
  [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
  [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
  [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
  [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
  [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
  [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
].freeze
F =
[
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
  [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
  [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
  [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
  [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
  [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
  [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
  [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]
].freeze
INV =
[0, 4, 3, 2, 1, 5, 6, 7, 8, 9].freeze

Class Method Summary collapse

Methods included from Utils

digits_from_number

Class Method Details

.check_digit(number) ⇒ Object

Generates the check digit for a number



41
42
43
44
45
46
# File 'lib/validatr/verhoeff.rb', line 41

def self.check_digit(number)
  digits = digits_from_number(number)
  digits.push(0)
  c = encode(digits)
  INV[c]
end

.encode(digits) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/validatr/verhoeff.rb', line 48

def self.encode(digits)
  c = 0
  digits.reverse.map.with_index do |d, i|
    f = F[i % 8][d]
    c = D[c][f]
  end
  c
end

.valid?(number) ⇒ Boolean

Returns true if a number is a valid Verhoeff number, false otherwise

Returns:

  • (Boolean)


34
35
36
37
38
# File 'lib/validatr/verhoeff.rb', line 34

def self.valid?(number)
  digits = digits_from_number(number)
  c = encode(digits)
  c.zero?
end