module Sjekksum::Verhoeff

Module for calculation and validation of Verhoeff checksums

@see en.wikipedia.org/wiki/Verhoeff_algorithm Verhoeff algorithm

Constants

DIHEDRAL_GROUP_D5

Table of multiplication in the dihedral group D5

INVERSE

The multiplicative inverse of a digit in the dihedral group D5

PERMUTATION

The permutation table

Public Instance Methods

checksum(number)
Alias for: of
convert(number) click to toggle source

Transforms a number by appending the Verhoeff checksum digit

@example

Sjekksum::Verhoeff.convert(142857) #=> 1428570

@param number [Integer, String] number without a checksum

@return [Integer, String] final number including the checksum

# File lib/sjekksum/verhoeff.rb, line 85
def convert number
  raise_on_type_mismatch number
  typed_conversion number
end
Also aliased as: transform
is_valid?(number)
Alias for: valid?
of(number) click to toggle source

Calculates Verhoeff checksum

@example

Sjekksum::Verhoeff.of(142857) #=> 0

@param number [Integer, String] number for which the checksum should be calculated

@return [Integer] calculated checksum

# File lib/sjekksum/verhoeff.rb, line 49
def of number
  raise_on_type_mismatch number
  digits = convert_number_to_digits(number)

  INVERSE[digits.reverse_each.with_index.reduce(0) { |check, (digit, idx)|
    d_row = DIHEDRAL_GROUP_D5[check]
    d_row[ PERMUTATION[idx.next % 8][digit] ]
  }]
end
Also aliased as: checksum
transform(number)
Alias for: convert
valid?(number) click to toggle source

Verhoeff validation of provided number

@example

Sjekksum::Verhoeff.valid?(1428570) #=> true

@param number [Integer, String] number with included checksum

@return [Boolean]

# File lib/sjekksum/verhoeff.rb, line 69
def valid? number
  raise_on_type_mismatch number
  num, check = split_number(number)
  self.of(num) == check
end
Also aliased as: is_valid?