Jon Peterson >
Algorithm-Verhoeff-0.3 >
Algorithm::Verhoeff

Module Version: 0.3
Algorithm::Verhoeff - Perl extension for checking and computing Verhoeff check digits

use Algorithm::Verhoeff; my $long_number = 1456789; # add a check digit to that to catch typos! $long_number .= verhoeff_get($long_number); # note - append don't add! print $long_number; #prints 14567894 # Lets see if I can re-type that accurately my $test = '14657894'; # oops! unless (verhoeff_check($test)) { print "Failed check - typo?"; }

This implements the Verhoeff check digit algorithm. It's a single digit checksum designed specifically for catching data entry mistakes in number sequences. It catches the vast majority of common mistakes such as transposed digits, ommitted digits, double entered digits and so on.

By default, this module will export verhoeff_check() verhoeff_get()

Into the current package.

Using numbers that pass the verhoeff check is useful for things like product codes. This is because such numbers almost never pass the verhoeff check if they as mis-typed. This includes common typos such as ommitted or repeated digits, transposed digits and so on. Since it only adds a single digit onto what might already be a longish number, it's a good algorithm for use where humans need to enter or read the numbers.

When we say 'number' we really mean 'string of digits' since that is what the Verhoeff algorithm works on.

To generate such a number, pick a starting number, call verhoeff_check() to get a check digit, and then APPEND that digit to the end of the original number. Do NOT add the digit arithmetically to the original number.

The new number will how pass the verhoeff_check(). In other words, if verhoeff_check() is called with the new number as its argument, it will return 1. If it is called with a mistyped version of the original number it will (very probably) return 0. For common forms of typo such as ommitted digits, accuracy is over 99%.

verhoeff_get accepts a number or string as an argument, and returns a check digit between 0 and 9.

verhoeff_check accepts a number of string as an argument, and returns 1 if it passes the check, or 0 otherwise.

Both functions convert their argument to a string internally. This will break for large (<32 bit)numbers due to Perl representing them in standard form when stringified. To get round this, either pass the number as a string to begin with, or use the bignum module in your program.

Thus:

my $num = 57382957482395748329574923; # Big number! verhoeff_get($num); # Fatal error unless program uses bignum module.

But:

my $num = '57382957482395748329574923'; # Long string! verhoeff_get($num); # Works fine.

Jon Peterson (jon -at- snowdrift.org)

Copyright (C) 2004 by Jon Peterson

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.4 or, at your option, any later version of Perl 5 you may have available.

syntax highlighting: