nanahara.log

プログラミング関係のノート

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

参考

Goで実装してみる

gist.github.com

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

実装

gist.github.com

テスト用データ

テスト用のクレジットカードの番号は、以下のサイトから借りさせていただいた

ECサイトの動作テストに使える、クレジットカードのテスト番号一覧 | Webクリエイターボックス