校验位算法 Luhn mod N 与简单和

Mar*_*aio 2 algorithm checksum check-digit

您知道为什么Luhn mod N 算法为了创建校验位而通过将每个偶数放置的字符的值加倍而不是执行所有字符的简单总和来执行求和吗?

用伪代码的话:

给出:

var s = "some string i want to create check digit";
Run Code Online (Sandbox Code Playgroud)

你知道为什么 Luhn mod N 基本上是这样的:

for(i from s.length-1 to 0)
   if(i is even)
      checkdigit += chr2int(s[i]) * 2;
   else
      checkdigit += chr2int(s[i]);
Run Code Online (Sandbox Code Playgroud)

而不是简单地做一个总和

for(i from s.length-1 to 0)
   checkdigit += chr2int(s[i]);
Run Code Online (Sandbox Code Playgroud)

他们仍然可以通过一个mod操作终止,使校验位适合一个字符

return int2chr( chr2int('a') + (checkdigit mod 25) );
Run Code Online (Sandbox Code Playgroud)

作为这个问题的旁注,它可能对 Luhn 算法的图形表示感兴趣,这使得它更容易理解:

在此处输入图片说明

其实这个是原始的 Luhn 算法,甚至不需要使用 MOD 函数。

SWe*_*eko 5

校验位字符旨在防止意外修改输入,例如当职员通过键盘输入数字时。

如果只使用一个和,字符串“ABCD”和“ABDC”将产生相同的校验和(“A”+“B”+“C”+“D”),所以简单的交换错误可能会被忽视。

但是,考虑到奇偶性,“ABCD”和“ABDC”将变成 (2"A" + "B" + 2"C" + "D") 和 (2"A" + "B" + 2"D" + "C") 分别是(可能)不同的数字,因此通过这种方式我们可以检测两个字符是否被无意中交换了。