4

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

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

我的问题是:

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

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

我试图防止转置字符、丢失字符、多余字符和简单的错误数字。

4

2 回答 2

3

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

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

集装箱系统将每个值乘以 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

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

于 2009-02-06T11:32:08.837 回答
2

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

于 2009-02-06T10:45:02.490 回答