2

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

在伪代码词中:

给定:

var s = "some string i want to create check digit";

你知道为什么 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]);

而不是简单地做一个总和

for(i from s.length-1 to 0)
   checkdigit += chr2int(s[i]);

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

return int2chr( chr2int('a') + (checkdigit mod 25) );

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

在此处输入图像描述

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

4

1 回答 1

5

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

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

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

于 2011-04-05T16:14:25.563 回答