Luhnを試すことができます。説明した内容よりも少し複雑ですが、要件を満たします。
ウィキペディアからのコピペ:
Luhn アルゴリズムは、1 桁のエラーだけでなく、隣接する数字のほぼすべての転置も検出します。ただし、09 から 90 までの 2 桁のシーケンス (またはその逆) の転置は検出されません。可能性のある 10 個のツイン エラーのうち 7 個を検出します (22 ↔ 55、33 ↔ 66、または 44 ↔ 77 は検出しません)。
その他のより複雑なチェック ディジット アルゴリズム (Verhoeff アルゴリズムや Damm アルゴリズムなど) は、より多くの転記エラーを検出できます。Luhn mod N アルゴリズムは、数値以外の文字列をサポートする拡張機能です。
アルゴリズムは右から左の方法で数字を操作し、ゼロの数字は位置のシフトを引き起こす場合にのみ結果に影響を与えるため、数字の文字列の先頭をゼロで埋めても計算には影響しません。したがって、特定の桁数にパディングするシステム (たとえば、1234 を 0001234 に変換することによって) は、パディングの前または後に Luhn 検証を実行して、同じ結果を得ることができます。
0 を奇数長の数値の先頭に追加すると、数値を右から左ではなく左から右に処理して、奇数桁を 2 倍にすることができます。
このアルゴリズムは、チェックサムを計算するハンドヘルドの機械装置に関する米国特許に記載されています。したがって、かなりシンプルである必要がありました。デバイスは、機械的手段によって mod 10 の合計を取得しました。置換数字、つまり double および reduce プロシージャの結果は、機械的に生成されませんでした。むしろ、数字は機械の本体に並べ替えられた順序でマークされていました。