您好我正在尝试在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)
校验位(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
这里(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)
演示:
>>> luhn_residue('79927398713') 0 >>> luhn_residue('05671564547361') 6 >>> luhn_residue(getImei(14)) 0