你好,我正在尝试在 python 中创建一个函数来生成有效的 IMEI 号码,所以这是我的函数。IMEI 验证使用 Luhn 算法,所以我尝试在我的脚本中实现它。
def getImei():
num = ''
suma = 0
for i in range(0,13):
digit = random.randrange(0,9)
suma = suma + digit
num = num + str(digit)
suma = suma * 9
digit = suma % 10
num = num + str(digit)
return num
然而,该函数无法生成有效的 IMEI 号码。我在维基百科上找到了一篇文章,告诉我如何生成校验位(http://en.wikipedia.org/wiki/Luhn_algorithm http://en.wikipedia.org/wiki/Luhn_algorithm )
校验位 (x) 是通过计算数字之和,然后计算该值的 9 倍模 10(以等式形式,(67 * 9 mod 10))获得的。
以算法形式:
1.计算数字之和(67)。
2.乘以 9 (603)。
3.最后一位数字3是校验位。
是我遗漏了什么还是维基有误?
请注意,奇数(从末尾开始,从 0 开始)位置的数字会加倍,因此您必须将其添加到代码中,例如以下代码将返回 luhn 校验和:
def luhn_residue(digits):
return sum(sum(divmod(int(d)*(1 + i%2), 10))
for i, d in enumerate(digits[::-1])) % 10
Here (1 + i%2)
乘数等于2
对于奇数位置的数字,以及1
为均匀定位。然后sum(divmod(..., 10))
返回(可能)两位数字的数字总和,以及结果序列的外部总和。
您可以使用它来生成有效的数字序列:
def getImei(N):
part = ''.join(str(random.randrange(0,9)) for _ in range(N-1))
res = luhn_residue('{}{}'.format(part, 0))
return '{}{}'.format(part, -res%10)
Demo:
>>> luhn_residue('79927398713')
0
>>> luhn_residue('05671564547361')
6
>>> luhn_residue(getImei(14))
0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)