银行卡号码的校验规则(Luhn算法/模10算法)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了银行卡号码的校验规则(Luhn算法/模10算法)相关的知识,希望对你有一定的参考价值。

银行卡校验

可以用于前端需要用户输入银行卡时做初步校验

银行卡号码的校验采用Luhn算法,校验过程大致如下:

  1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….

  2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。

  3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。

  4. 如果s能够整除10,则此号码有效,否则号码无效。

因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法。

% 取模 - 返回除法的余数
*= 乘法赋值运算符 c = a 等效于 c = c a
// 取整除 - 返回商的整数部分(向下取整)

使用Python实现

def luhn(card_num):
    s = 0
    card_num_length = len(card_num)
    for _ in range(1, card_num_length + 1):
        t = int(card_num[card_num_length - _])
        print("当前银行卡对应数字t={}".format(t))
        print("当前_为{}".format(_))
        print("_取模{}".format(_ % 2))
        if _ % 2 == 0:
            print("当前是偶数位")
            t *= 2
            print("t={}".format(t))
            s += t if t < 10 else t % 10 + t // 10

        else:
            print("当前为奇数位")
            s += t
        print("s={}".format(s))
    return s % 10 == 0

if __name__ == ‘__main__‘:
    print(luhn(‘6226095711989751‘))

执行结果:

当前银行卡对应数字t=1
当前_为1
_取模1
当前为奇数位
s=1

当前银行卡对应数字t=5
当前_为2
_取模0
当前是偶数位
t=10
s=2

......

当前银行卡对应数字t=6
当前_为16
_取模0
当前是偶数位
t=12
s=70

True

参考来源:
https://www.cnblogs.com/cc11001100/p/9357177.html

百度百科介绍Luhn算法

我们以数字“7992739871”为例,计算其校验位:
从校验位开始,从右往左,偶数位乘2(例如,7*2=14),然后将两位数字的个位与十位相加(例如,10:1+0=1,14:1+4=5);
把得到的数字加在一起(本例中得到67);
将数字的和取模10(本例中得到7),再用10去减(本例中得到3),得到校验位。
Python实现

def checkLuhn(purportedCC=‘‘):
    sum_ = 0
    parity = len(purportedCC) % 2
    for i, digit in enumerate([int(x) for x in purportedCC]):
        if i % 2 == parity:
            digit *= 2
            if digit > 9:
                digit -= 9
        sum_ += digit
    return sum_ % 10 == 0

以上是关于银行卡号码的校验规则(Luhn算法/模10算法)的主要内容,如果未能解决你的问题,请参考以下文章

C:信用卡号码检查器/ Luhn 算法

信用卡号码的 Luhn 或 Verhoeff 算法

为啥Luhn算法乘以2?

程序冻结 - Luhn 算法

增强Luhn算法的实现?

如何使用 Luhn 算法创建信用卡验证器?