我正在使用以下一组值来创建一个 9 字符长的 base 31 值:
0123456789ABCDEFGHJKLMNPQRTUWXY
我正在考虑修改 Luhn 算法以使用我的基础。
我的问题是:
在以 10 为底的情况下,Luhn 算法将每个值在偶数位置加倍,然后如果结果大于 10,则将结果的各个数字相加。
我应该仍然将我的偶数位置值加倍,还是使用更高的乘数?
我试图防止转置字符、丢失字符、多余字符和简单的错误数字。
我研究了 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
似乎使用这些算法,主要要求是乘数不能被基数整除,并且余数的模式不会在您要验证的代码长度内重复。
不要重新发明轮子 - 改用Luhn mod N。