1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Luhnアルゴリズムの学習とそのRuby実装コード例

2022-01-04 15:31:21

LUHNアルゴリズムについて
LUHNアルゴリズム。主にクレジットカードなどの文書番号の正当性を計算するために使用される。
1. カード番号の下1桁から、偶数桁の数字を2倍します。2倍した結果が2桁になる場合は、2桁を足して保存します。
2. すべての数字を足して合計を求めます。
3. クレジットカードの番号が正規のものであれば、合計を10で割ることができます。
LuhnのアルゴリズムまたはLuhnの式は、"modulo 10 algorithm"とも呼ばれ、ID番号、IMEI番号、米国のベンダー識別によく使われる簡単な検証式である。これは、ID番号、IMEI番号、米国ベンダー識別番号、またはカナダの社会保障番号の確認に通常使用される簡単な確認式です。このアルゴリズムは、IBMの科学者ハンス・ピーター・ルーンによって作成され、1954年1月6日に特許出願し、1960年8月23日に米国特許番号2950048で認可されました。
このアルゴリズムは常に一般的に使用されており、今日でも広く使われている。ISO/IEC 7812-1で指定されている。暗号的に安全なハッシュ関数であることは意図しておらず、悪意のある攻撃ではなく、偶発的なエラーを防ぐことを目的としている。多くのクレジットカードや多くの政府のID番号では、このアルゴリズムを使用して、一連のランダムな数字から有効な数字を抽出している。

長所と短所
Luhnアルゴリズムは、あらゆるシングルコードエラーと、ほとんどすべての隣接桁の転置エラーを検出します。しかし、2桁のシーケンス09から90(またはその逆)のエラーは検出できません。同じ2桁のエラーの10分の7を検出します(22と55の順列、33と66の順列、44と77の順列は検出しません)。その他、Fairhoughのアルゴリズムなど、より洗練された桁数チェックのアルゴリズムでは、より多くの転記ミスを検出することができます。mod NのLuhnアルゴリズムは、Luhnアルゴリズムを拡張して、数字以外の文字列に対応したものです。なぜなら、このアルゴリズムは右から左へのアプローチをとり、ゼロビットは計算結果に影響を与えるからです。ゼロが原因で桁がずれたり、文字列の先頭をゼロで埋めたりした場合のみ、計算結果に影響を与えません。したがって、1234が0001234の前でも後でもゼロで埋め尽くされていても、Luhnのアルゴリズムを使用した結果は同じになります。
このアルゴリズムは、携帯機器や機械装置のチェックサムを計算するために米国で特許を取得しています。だから、できるだけシンプルでなければならない。

Ruby版実装
ルーンによるアルゴリズムの基本はとてもシンプルです。(例: 49927398716)
ステップ1:クレジットカードの番号を逆順に並べる(61789372994)
ステップ2:奇数位置の数字を逆順に取り出し、合計s1まで足す(s1=6+7+9+9+4=42)
ステップ3:偶数番目の数字を逆順に取り出し、それぞれの数字に2を掛ける(例:2,16,6,4,18)
手順4:手順3で得られた10以上の数字を桁+10に変換する。(例: 2,7,6,4,9)
ステップ5:処理した偶数桁の数字を足してs2を求める(s2=2+7+6+4+9=28)
ステップ6: (s1+s2)%10 == 0 ならば有効、そうでなければ無効を解読する。(有効)
コード

module LuhnValidator 
 def validate(number) 
  s1 = s2 = 0 
  number.to_s.reverse.chars.each_slice(2) do |odd, even| 
   s1 += odd.to_i 
 
   double = even.to_i * 2 
   double -= 9 if double >= 10 
   s2 += double 
  end 
  (s1 + s2) % 10 == 0 ? 'valid' : 'invalid' 
 end 
end