GoでLuhnアルゴリズム
Luhnアルゴリズムについて
用途
利点と欠点
- 任意の1桁の間違いや隣接する桁の数字の順序間違いを検出できる
- 09 から 90 (または逆)という間違いは検出できない
- 同じ数字が2つ連続する場合の間違いも10種類のうち4種類までは検出できる(22 ⇔ 55、33 ⇔ 66、44 ⇔ 77 は検出できない)
方法
「49927398716」 という番号を検証する場合。
操作 | 例 |
---|---|
右端から偶数番目の桁をそれぞれ2倍 | 4,18,9,4,7,6,9,16,7,2,6 |
それぞれの数字の総和を計算する | 4+1+8+9+4+7+6+9+1+6+7+2+6 = 70 |
10で割りきれるか調べる | 70 mod 10 = 0 |
参考
- Wikipedia (主にこちらから抜粋)
Goで実装してみる
GoでUnitTestしてみる
Goでテスト書いたことなかったので、せっかくなのでテストも書いてみる
testingパッケージを使うらしい。
気になった点として、GoにはAssertがないが、これはテスト用のミニ言語の存在を嫌う思想のようだ。
詳しくは Go の Test に対する考え方 - Qiita
理想のテスティングとは…。
最初の所感だと、Assertないと不便に感じたが、とりあえず標準に従うことにする
実行例
➜ src git:(master) ✗ go test -v luhn === RUN TestLuhn --- PASS: TestLuhn (0.00s) PASS ok luhn 0.007s # わざとFail ➜ src git:(master) ✗ go test -v luhn === RUN TestLuhn --- FAIL: TestLuhn (0.00s) luhn_test.go:49: Oops! [6011000990139425] is invalid FAIL ok luhn 0.007s
実装
テスト用データ
テスト用のクレジットカードの番号は、以下のサイトから借りさせていただいた