我正在使用以下一组值来创建一个9个字符的长基数31值:
0123456789ABCDEFGHJKLMNPQRTUWXY
我正在考虑修改Luhn算法以使用我的基础。
我的问题是:
在基数10中,Luhn算法将偶数位置的每个值加倍,然后如果结果> 10,则将结果的各个数字加在一起。
我是否仍然要将偶数位置值加倍,或使用更高的乘数?
我正在尝试防止转置字符,丢失字符,多余字符以及只是错误的数字。
答案 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。