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
Similar Posts:
- [PHP]文章中の単語に自動でリンクを貼る(キーワードリンク)
- [PHP]10進数を任意の文字を使って62進数などのn進数に相互変換する(基数変換)
- [PHP]画像を連結して数値を表示する
- [PHP]マルチバイト文字列を比較して類似の度合いを計算する
- [PHP]ひらがな・カタカナをローマ字に変換する
- [PHP]basename() はマルチバイトに対応できない?
- [PHP]料金表のようなものをテキストだけで表現する
- [PHP]三次元空間での2点を結ぶ線分の中点