NAME

Algorithm::LUHN_XS - Very Fast XS Version of the original Algorithm::LUHN

SYNOPSIS

use Algorithm::LUHN_XS qw/check_digit is_valid/;

my $c;
$c = check_digit("43881234567");
print "It works\n" if is_valid("43881234567$c");

$c = check_digit("A2C4E6G8"); # this will return undef
if (!defined($c)) {
    # couldn't create a check digit
}

print "Valid LUHN characters are:\n";
my %vc = Algorithm::LUHN_XS::valid_chars();
for (sort keys %vc) {
  print "$_ => $vc{$_}\n";
}

Algorithm::LUHN_XS::valid_chars(map {$_ => ord($_)-ord('A')+10} A..Z);
$c = check_digit("A2C4E6G8");
print "It worked again\n" if is_valid("A2C4E6G8$c");

DESCRIPTION

This module is an XS version of the original Perl Module Algorithm::LUHN, which was written by Tim Ayers. It should work exactly the same, only substantially faster. The supplied check_digit() routine is 100% compatible with the pure Perl Algorithm::LUHN module, while the faster check_digit_fast() and really fast check_digit_rff() are not.

How much faster? Here's a benchmark, running on a 3.4GHz i7-2600:

Benchmark: timing 100 iterations

Algorithm::LUHN: 69 secs (69.37 usr 0.00 sys) 1.44/s

check_digit: 2 secs ( 1.98 usr 0.00 sys) 50.51/s

check_digit_fast: 2 secs ( 1.68 usr 0.00 sys) 59.52/s

check_digit_rff: 1 secs ( 1.29 usr 0.00 sys) 77.52/s

So, it's 35x to 53x faster than the original pure Perl module, depending on how much compatibility with the original module you need.

The rest of the documentation is mostly a copy of the original docs, with some additions for functions that are new.

This module calculates the Modulus 10 Double Add Double checksum, also known as the LUHN Formula. This algorithm is used to verify credit card numbers and Standard & Poor's security identifiers such as CUSIP's and CSIN's.

You can find plenty of information about the algorithm by searching the web for "modulus 10 double add double".

FUNCTION

CAVEATS

This module, because of how valid_chars() stores data in the XS portion, is NOT thread safe.

The _fast and _rff versions of is_valid() and check_digit() don't have the same return values for failure as the original Algorithm::LUHN module. Specifically:

Also, be careful with passing long numbers around. Perl will, depending on the context, convert things like 12345678912345 to 1.2345678912345e+1. Try to keep things in "string context".

SEE ALSO

Algorithm::LUHN is the original pure perl module this is based on.

Algorithm::CheckDigits provides a front-end to a large collection of modules for working with check digits.

Business::CreditCard provides three functions for checking credit card numbers. Business::CreditCard::Object provides an OO interface to those functions.

Business::CardInfo provides a class for holding credit card details, and has a type constraint on the card number, to ensure it passes the LUHN check.

Business::CCCheck provides a number of functions for checking credit card numbers.

Regexp::Common supports combined LUHN and issuer checking against a card number.

Algorithm::Damm implements a different kind of check digit algorithm, the Damm algorithm (Damm, not Damn).

Math::CheckDigits implements yet another approach to check digits.

Neil Bowers has also written a review of LUHN modules, which covers them in more detail than this section.

REPOSITORY

https://github.com/krschwab/Algorithm-LUHN_XS

AUTHOR

This module was written by Kerry Schwab (http://search.cpan.org/search?author=KSCHWAB).

COPYRIGHT

Copyright (c) 2018 Kerry Schwab. All rights reserved. Derived from Algorithm::LUHN, which is (c) 2001 by Tim Ayers.

LICENSE

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

CREDITS

Tim Ayers, for the original pure perl version of Algorithm::LUHN.

Neil Bowers, the current maintainer of Algorithm::LUHN.

The inspiration for this module was a PerlMonks post I made here: https://perlmonks.org/?node_id=1226543, and I received help from several PerlMonks members:

    AnomalousMonk

    BrowserUK

    Corion

    LanX

    tybalt89