Location : Home > Languages > Perl > Package Title : Algorithm::LUHN |
![]() |
Algorithm::LUHN - Calculate the Modulus 10 Double Add Double checksum
use Algorithm::LUHN qw/check_digit is_valid/; $c = check_digit("43881234567"); print "It works\n" if is_valid("43881234567$c"); $c = check_digit("A2C4E6G8"); # this will cause an error print "Valid LUHN characters are:\n"; my %vc = Algorithm::LUHN::valid_chars(); for (sort keys %vc) { print "$_ => $vc{$_}\n"; } Algorithm::LUHN::valid_chars(map {$_ => ord($_)-ord('A')+10} A..Z); $c = check_digit("A2C4E6G8"); print "It worked again\n" if is_valid("A2C4E6G8$c");
本モジュールはルーン式(LUHN Formula)として知られるモジュラス10(Modulus 10 Double Add Double checksum)を計算する。本アルゴリズムはクレジットカードナンバーや CUSIP(Committee on Uniform Securities Identification Procedures;統一秘密保全識別手順に関する委員会)・CSIN(CUSIP International Numbering System)のような Standard & Poor's security identifier の検証に用いられる。
アルゴリズムについてはウェブ上で "modulus 10 double add double" と検索すれば多くの情報が得られるだろう。
is_valid CHECKSUMMED_NUM
この関数は CHECKSUMMED_NUM の最初の文字が残りの文字列の正しいチェックサムであれば true を返し、そうでなければ false を返す。最後の文字はチェックサム計算には編入しない。valid_chars() により定義されたように妥当でない文字が NUM に含まれていれば false を返す。NUM が妥当でなければ $Algorithm::LUHN::ERROR にはその原因が記されている。
本関数は以下の式と同等である。
substr $N,length($N)-1 eq check_digit(substr $N,0,length($N)-1)
check_digit NUM
この関数は所与の数値に対するチェックサムを返す。check_digit を計算できなければ undef を返し、$Algorithm::LUHN::ERROR にその理由を記す。
valid_chars LIST
デフォルトでは本モジュールは 0..9 のみを妥当な文字として認識するが、時にはたとえば Standard & Poor's identifers のように 0..9, A..Z, @, #, * を含む文字列を妥当な文字として認識させたいこともある。この関数はすでに受領されているリストに新たな文字を追加するものである。
LIST は character => cvalue のマッピングである。たとえば Standard & Poor は A..Z と 10..35 をマップし、LIST には (A, 10, B, 11, C, 12, ...) を妥当な文字として認識する。
この adds または re-maps 文字に注意してほしい。すでに妥当とみなされているが LIST に追加されていない文字も妥当なままである。
LIST が指定されていなければこの関数は現在の妥当な文字マップを返す。
本モジュールは Tim Ayers (http://search.cpan.org/search?author=TAYERS)によって書かれた。
Copyright (c) 2001 Tim Ayers. All rights reserved.
本プログラムはフリーソフトウェアであり、 Perl 本体と同等の条件で修正/再配布してもよい。
![]() |
Updated : 2006/08/09 |