Python验证信用卡号的有效性(算法)(称为Luhn检测或者mod 10 检测)

转载自:
https://baijiahao.baidu.com/s?id=1662553267127372613&wfr=spider&for=pc
有修改
一个信用卡号必须是13到16位的整数

1954年,IBM的Hans Luhn提出一种算法,用于验证信用卡号的有效性。

这个算法在确定输入的卡号是否正确,或者这张信用卡是否被扫描仪正确扫描方面是非常有用的。

银行卡的第一位数

4,指Visa信用卡
5,指Master万事达卡
37,指American Express 国际信用卡
6,指Discover 信用卡

科普小知识:
1.银联卡

  我们一般办的卡都是银联卡,卡面上会有“银联”的字样,就是你的卡可以在不同银行的ATM机上取款。
  银联是中国的银行卡发行机构,只能用人民币付款。银联不止发行借记卡还发行信用卡,大家可以这样理解,
  银联卡不一定是信用卡,但信用卡基本都是银联卡。相信有朋友应该在很多国家和地区都看到了“银联”支付的标识,
  对,你没看错,很多实力雄厚的银行已经跨出了中国国门,走向了世界。
  所以我们在国外很多地方也是可以使用到银联卡的,当然,不同国家地区或存在一个汇率问题,可以在银行转化当地币种用,这就不做过多介绍了。

  2.MasterCard

	MasterCard,中国名称为:万事达卡,是全球第二大信用卡国际组织,是由参加万事达卡国际组织的金融机构会员发行的,在欧洲地区的流行度相对更大一些。
	3.VISA

	VISA,是一个信用卡品牌,就像中国的银联,VISA国际组织是目前世界上最大的信用卡国际组织,在美洲、亚洲国家等国家较为流行。

遵循这个合法性检测可以生成所有的信用卡号,通常称之为Luhn检测或者Mod 10检测,可以如下描述(为了方便解释,假设卡号4388576018402626:

1.从右到左对偶数位数字翻倍。如果对某个数字翻倍之后的结果是一个两位数,那么就将这两位加在一起得到一位数。
Python验证信用卡号的有效性(算法)(称为Luhn检测或者mod 10 检测)_第1张图片

2.现在将第一步得到的所有一位数相加。
在这里插入图片描述

3.将卡号里从右到左奇数位上的所有数字相加。
Python验证信用卡号的有效性(算法)(称为Luhn检测或者mod 10 检测)_第2张图片

4.将第二步和第三步得到的结果相加。

Python验证信用卡号的有效性(算法)(称为Luhn检测或者mod 10 检测)_第3张图片

5.如果第四步得到的结果能被10整除,那么卡号是合法的;否则,卡号是不合法的。
在这里插入图片描述

例如,号码4388576018402626是不合法的,但是号码4388576018410707是合法的。 编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的

代码示例

def luhn(card_no):
    #从右到左所以翻转
    digits = [int(x) for x in reversed(card_no)]
    #对偶数位数字翻倍 d*2
    even_digits = [d * 2 for d in digits[1::2]]
    #如果对某个数字翻倍之后结果是一个两位数,将这两位数字加在一起
    even_digits = [d // 10 + d % 10 for d in even_digits]
    #将上一步所有一位数相加
    even_sum = sum(even_digits)
    #将卡号里从右到左奇数位上所有数字相加
    odd_sum = sum(digits[::2])
    #将even_sum和odd_sum相加,能被10整数为合法,否则不合法
    if (odd_sum + even_sum) % 10 == 0:
        return True
    else:
        return False
if __name__ == '__main__':
    # Right card format (4-4-4-4) & wrong card number
    print(luhn('6212345678901234'))

    # Right card format (4-4-4-4) & right card number
    print(luhn('6212345678901232'))

#输出
False
True

另外还有可参考:链接

你可能感兴趣的:(笔记,python,算法)