Luhn公式的实现

JCh*_*ris 3 python math checksum luhn

我试图在Python中实现Luhn公式,这是我的代码:

import sys


def luhn_check(number):
    if number.isdigit():
        last_digit = int(str(number)[-1])
        reverse_sequence = list(int(d) for d in str(int(number[-2::-1])))

        for i in range(0, len(reverse_sequence), 2):
            reverse_sequence[i] *= 2

        for i in range(len(reverse_sequence)):
            if reverse_sequence[i] > 9:
                reverse_sequence[i] -= 9

        sum_of_digits = 0
        for i in range(len(reverse_sequence)):
            sum_of_digits += reverse_sequence[i]

        result = divmod(sum_of_digits, 10)

        if result == last_digit:
            print("[VALID] %s" % number)
        else:
            print("[INVALID] %s" % number)
        quit()

    print("[ERROR] \" %s \" is not a valid sequence." % number)
    quit()


def main():
    if len(sys.argv) < 2:
        print("Usage: python TLF.py <sequence>")
        quit()

    luhn_check(sys.argv[1])

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

但它无法正常工作:

[INVALID] 4532015112830366
[INVALID] 6011514433546201
[INVALID] 6771549495586802
Run Code Online (Sandbox Code Playgroud)

等等...

但代码的逻辑对我来说似乎没问题.我遵循这个工作流程:

Luhn公式:

  1. 从数字中删除最后一位数字.最后一位是我们想要检查的数字反转数字

  2. 将奇数位置(1,3,5等)中的数字乘以2,并将9减去任何高于9的结果

  3. 将所有数字加在一起

  4. 校验位(卡的最后一个数字)是您需要添加的数量才能获得10的倍数(模10)

phy*_*rox 7

我认为算法不正确.

第二个步骤,你需要总结的产品,而不是9.减去参考的数字:维基百科.

在维基百科中,您有这个例子:

def luhn_checksum(card_number):
    def digits_of(n):
        return [int(d) for d in str(n)]
    digits = digits_of(card_number)
    odd_digits = digits[-1::-2]
    even_digits = digits[-2::-2]
    checksum = 0
    checksum += sum(odd_digits)
    for d in even_digits:
        checksum += sum(digits_of(d*2))
    return checksum % 10

def is_luhn_valid(card_number):
    return luhn_checksum(card_number) == 0


result = is_luhn_valid(4532015112830366)
print 'Correct:' + str(result)
result = is_luhn_valid(6011514433546201)
print 'Correct:' + str(result)
result = is_luhn_valid(6771549495586802)
print 'Correct:' + str(result)
Run Code Online (Sandbox Code Playgroud)

结果:

>>>Correct:True
>>>Correct:True
>>>Correct:True
Run Code Online (Sandbox Code Playgroud)

  • 是的,我知道。但在维基百科中有两个例子:一个用于生成,另一个用于测试。我在此答案中发布的代码是检查验证号的代码。 (2认同)

小智 5

这是我发现的最简洁的 Luhn 测试 python 公式:

def luhn(n):
    r = [int(ch) for ch in str(n)][::-1]
    return (sum(r[0::2]) + sum(sum(divmod(d*2,10)) for d in r[1::2])) % 10 == 0
Run Code Online (Sandbox Code Playgroud)

上述函数和其他 Luhn 实现(以不同的编程语言)可在https://www.rosettacode.org/wiki/Luhn_test_of_credit_card_numbers中找到。