Luhn アルゴリズムは様々な識別番号に使われているチェックサム方式の1つで、MOD-10アルゴリズムとも呼ばれています。
このアルゴリズムを使って生成された番号であれば入力時にタイプミスをした場合でも、誤りを検出することができます。
ルールは比較的にシンプルで、検査したい数字を右から順に奇数桁、偶数桁に分け、奇数桁の合計と偶数桁の各桁の数字を倍にした数の合計を合わせて 10 の倍数になっていれば正しいとされます。
ただし、偶数桁の倍にした数が2桁になる場合はひとけたずつに分解して足します。
7 * 2 = 14 のとき、14 を 1 + 4 とし、5 が結果となります。これは倍にした数から 9 引いた数と等しくなるのでそのほうが簡単です。
<?php
$number = '4111111111111111';
echo luhnCheck($number);
function luhnCheck($number) {
$number = preg_replace('/[^0-9]/', '', $number);
$length = strlen($number);
$sum = 0;
for($i = 0; $i < $length; $i++) {
$digit = (int)substr($number, $length -1 - $i, 1);
if( ($i + 1) % 2 == 0 ){
$sum += ($digit >= 5) ? $digit * 2 - 9 : $digit * 2;
} else {
$sum += $digit;
}
}
return ($sum % 10 == 0);
}
参考: Wikipedia https://en.wikipedia.org/wiki/Luhn_algorithm
