我应该使用什么作为基数31值的校验位算法?

时间:2009-02-06 10:21:54

标签: algorithm checksum

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

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

我的问题是:

在基数10中,Luhn算法将偶数位置的每个值加倍,然后如果结果> 10,则将结果的各个数字加在一起。

我是否仍然要将偶数位置值加倍,或使用更高的乘数?

我正在尝试防止转置字符,丢失字符,多余字符以及只是错误的数字。

2 个答案:

答案 0 :(得分:3)

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

我决定使用Freight Container系统的修改版本。

集装箱系统将每个值乘以2 ^ [位置](从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

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

答案 1 :(得分:2)

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