【问题标题】:Checkdigit algorithm Luhn mod N vs simple sum校验位算法 Luhn mod N vs 简单和
【发布时间】:2011-04-05 16:07:58
【问题描述】:

您知道为什么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函数。

【问题讨论】:

    标签: algorithm checksum check-digit


    【解决方案1】:

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

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

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

    【讨论】:

    • 酷!因此,我们是否可以说,如果我需要一种不同类型的校验和,只需要检查缺失字符而不是交换字符,我可以简单地使用总和吗?
    • @Marco:不是真的因为交换很便宜!
    • @epitaph:我想忽略交换错误不是出于效率原因。假设我想检查 url 的查询部分(即?usr=joe&curr=euro&amount=34),键/值对可以交换但 url 仍然有效,所以最好忽略交换错误。
    • @Marko:你在说什么?如果上面的例子已经被交换,那么你的公式就不再起作用了!可以举个例子吗?
    • @epitaph: @epitaph: s1 = "?usr=joe&curr=euro&amount=34" 对我来说与 s2 = "?curr=euro&amount=34&usr=joe" 相同如果我使用 Luhn mod N 公式计算 s1s2 上的校验位,我会得到 2 个不同的校验位,而简单的总和(就像我的公式)我会得到相同的校验位,你现在明白我在说什么了吗!
    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多