クレジットカード番号のチェックに有効なアルゴリズム
お仕事で使っているCakePHPに面白いチェックがあった。
クレジットカード番号は、乱数の羅列なのではなく、ルーン・アルゴリズム(Luhn algorithm - Wikipedia)という方法によって算出された数値らしい。
これをチェックに使う事ができるので組み込んでみた。
このルーン・アルゴリズムは末尾から数値を一桁飛ばしで2倍にし、全ての桁を足していくと10で割り切れるかというもの。
ちょっと難しいので、図で説明。
例えば、「49927398716」というカード番号だった場合、末尾から一桁飛ばしで二倍にする。
4 9 9 2 7 3 9 8 7 1 6 ↓*2 ↓ *2 ↓ *2 ↓ *2 ↓ *2 ↓ 4 18 9 4 7 6 9 16 7 2 6
算出した値を桁毎に足していき、10で割る。
4 18 9 4 7 6 9 16 7 2 6 ↓ 4189476916726 ↓ 4+1+8+9+4+7+6+9+1+6+7+2+6 ↓ 70 ↓ 70/10
この結果が割り切れれば、ルーン・アルゴリズムで正常な値となるわけ。
そして、CakePHPでこれを実現するには、Modelに
<?php class CardPayment extends AppModel{ var $validate = array( 'card_no' => array( 'luhn' => array('rule' => array('cc', 'all', true, null)) ) ); } ?>
とすればいい。