在python中生成IMEI

2024-10-02 20:35:29 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我正在尝试在python中创建一个函数来生成有效的IMEI数字,所以这里是我的功能。TheIMEI验证使用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编号。我在wikipedia上找到一篇文章,告诉我如何生成校验位(http://en.wikipedia.org/wiki/Luhn_algorithm

校验位(x)是通过计算位数之和,然后计算9倍的模10得到的(在等式形式,(67*9模10))。 算法形式: 1.计算数字之和(67)。 2.乘以9(603)。 最后一个数字3是校验位。在

是我遗漏了什么还是维基有问题?在


Tags: 函数功能脚本算法数字wikipedianum形式
3条回答

你跳过了这一步,如果结果大于10,每隔两位数取两位数之和。来自Wikipedia

From the rightmost digit, which is the check digit, moving left, double the value of every second digit; if product of this doubling operation is greater than 9 (e.g., 7 * 2 = 14), then sum the digits of the products (e.g., 10: 1 + 0 = 1, 14: 1 + 4 = 5).

@alko的解决方案并不适用于所有的IMEI号码:请参见有效IMEI号码的this list(或实际上相同的cc号码)。在

以下是有效的解决方案:

def luhn_residue(digits):
    """ Lunh10 residue value """
    s = sum(d if (n % 2 == 1) else (0, 2, 4, 6, 8, 1, 3, 5, 7, 9)[d]
            for n, d in enumerate(map(int, reversed(digits))))
    return (10 - s % 10) % 10

请注意,奇数(从末尾开始,从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表示奇数,而{}表示偶数位置。然后sum(divmod(..., 10))返回一个(可能)两位数字的位数和,并返回结果序列的外部和和。在

您可以使用它来生成有效的编号规则:

^{pr2}$

演示:

>>> luhn_residue('79927398713')
0
>>> luhn_residue('05671564547361')
6
>>> luhn_residue(getImei(14))
0

相关问题 更多 >