你知道为什么为了创建校验位,Luhn mod N algoritm通过将每个偶数放置的字符的值加倍而不是执行所有字符的简单和来执行求和吗?
在伪代码中:
鉴于:

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函数。

最佳答案

校验位字符是为了防止输入的意外损坏而设计的,例如当职员通过键盘输入数字时。
如果只使用一个和,字符串“ABCD”和“ABDC”将产生相同的校验和(“a”+“B”+“C”+“D”),那么简单的交换错误可能会发生而不会被注意到。
然而,将奇偶性简化为“abcd”和“abdc”将分别变为(2“a”+“b”+2“c”+“d”)和(2“a”+“b”+“c”+2“d”),这是(可能的)不同的数字,因此通过这种方式,我们可以检测两个字符是否被错误地交换。

关于algorithm - Checkdigit算法Luhn mod N与简单和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5554907/

10-11 00:35