【问题标题】:What should I use as a check digit algorithm for a base 31 value?我应该使用什么作为基数 31 值的校验位算法?
【发布时间】:2009-02-06 10:21:54
【问题描述】:

我正在使用以下一组值来创建一个 9 字符长的 base 31 值:
0123456789ABCDEFGHJKLMNPQRTUWXY

我正在考虑修改 Luhn 算法以使用我的基础。

我的问题是:

在以 10 为底的情况下,Luhn 算法将每个值在偶数位置加倍,然后如果结果大于 10,则将结果的各个数字相加。

我还是应该将偶数仓位值加倍,还是使用更高的乘数?

我正在尝试防止转置字符、丢失字符、多余字符和纯错误数字。

【问题讨论】:

  • 你能把它转换成base 10吗?

标签: algorithm checksum


【解决方案1】:

我研究了 Luhn mod N 算法,但它可以验证的内容非常有限。

我决定使用货运集装箱系统的修改版本。

海运集装箱系统将每个值乘以 2^[position](位置从 0 开始),然后对结果进行模 11 以得到以 10 为底的校验位(不建议使用 10 的结果)。

在这种情况下,诀窍是找到 x^0 到 x^[length] 范围内的值,这些值不能被您在模数上使用的数字整除。

我决定使用 3^[position] 作为乘数并对总和执行模 31 以获得校验位。

例如:0369CFJMK

Character  0     3     6     9     C     F     J     M     K
Value      0     3     6     9     12    15    18    21    19
--------------------------------------------------------------
Multiplier 1     3     9     27    81    243   729   2187
Result     0     9     54    243   972   3645  13122 45927

Total      63972 MOD 31 = 19

似乎对于这类算法,主要要求是乘数不能被基数整除,并且余数的模式不会在您要验证的代码长度内重复。

【讨论】:

  • 我相信这个校验和算法的正确名称是 SSCC(串行运输集装箱代码),它是 GS1 系列算法的一部分。
【解决方案2】:

不要重新发明轮子 - 改用 Luhn mod N

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 2010-11-09
    • 1970-01-01
    • 2010-12-31
    • 2016-12-22
    • 2011-05-11
    • 2020-03-13
    • 2017-01-28
    相关资源
    最近更新 更多