zoukankan      html  css  js  c++  java
  • 校验银行卡号是否符合Luhn算法及生成符合Luhn算法的银行卡号

    【注:Luhn算法,又叫模10算法(因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法)】

    一、校验银行卡号是否符合Luhn算法

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

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

    2. 对每一位的计算规则:如果这一位是奇数位,则返回该位数的数值本身(假设为Odd),如果是偶数位(假设为Even),则先将Even乘以2得到一个数k,如果k是一位数(小于10),直接返回k,否则将k的个位数和十位数相加值kk返回。

    4. 如果luhmSum能够整除10,则此银行号卡码符合Luhn算法(即有效),否则该银行卡号码不合法Luhn算法(即无效)。

    校验算法比较简单,一个python的实现:

    方法一:

    安装包:apt install python3-stdnum

    from stdnum import luhn

    luhn.is_valid(银行卡号)

    方法二:

    import random
    def checkBankCardNO(self,bankCardNO):
    ''' 校验银行卡算法符合 Luhm算法 (即是否有效)'''
    cardNO = bankCardNO.strip()
    flag = ''
    EvenSum = 0
    OddSum = 0
    luhmSum = 0
    if cardNO.isdigit():
    cardNOList =list(cardNO)
    checkNO = int(cardNOList[(len(cardNOList)-1)])
    for i in range(len(cardNOList)):
    k = 0
    if (i+1)%2 == 0:
    k = int(cardNOList[(len(cardNOList)-1)-i]) * 2
    kk = int(k / 10) + (k % 10)
    EvenSum = EvenSum + kk
    else:
    OddSum = OddSum + int(cardNOList[(len(cardNOList)-1)-i])
    luhmSum = 10 -(((EvenSum + OddSum) - checkNO) % 10)
    return checkNO == luhmSum


    二、生成符合Luhn算法的银行卡号

    生成符合Luhn算法的银行卡号,过程大致如下:

    1. 假设银行卡号位数为n位,随机生成(不算校验码的)n-1的数值字符,称为字符串preBankCardNO。

    2. 先假设字符串preBankCardNO有n位(实际上最右边一位缺失是n-1位),将preBankCardNO按照n位长度计算和luhmSum,因为最右边第一位是缺失的,忽略跳过,所以计算时最右边一位从2开始。

    3. 上一步得到字符串preBankCardNO的校验和luhmSum,用10减去uhmSum模10得到的值,最终结果即为校验位数值checkNO。

    4. 最终符合Luhn算法的银行卡号bankCardNO等于preBankCardNO字符串后面加上校验位checkNO字符。

    方法一:

    def luhnBankCardNOGenerator(self):
    ''' 生成校验码 Luhm算法'''
    cardNO = '62'+ '%13d' % (random.randint(1, 9999999999999))
    EvenSum = 0
    OddSum = 0
    cardNOList =list(cardNO)
    print(cardNOList)
    for i in range(len(cardNOList)):
    k = 0
    if i%2 == 0:
    k = int(cardNOList[(len(cardNOList)-1)-i]) * 2
    if int(k / 10):
    kk = k - 9
    print(kk)
    else:
    kk = k
    EvenSum = EvenSum + kk
    else:
    OddSum = OddSum + int(cardNOList[(len(cardNOList)-1)-i])
    checkNO = 10 - ((EvenSum + OddSum) % 10)
    bankCardNO = cardNO + str(checkNO)
    return bankCardNO

    方法二:

    待续...

  • 相关阅读:
    Selenium实战(七)——自动发送邮件
    Selenium实战(六)——数据驱动应用
    Selenium实战(四)——unittest单元测试3(测试用例的执行顺序)
    Selenium实战(四)——unittest单元测试2(断言方法+discover()多测试用例的执行)
    运维工具
    实用的shell脚本面试题和答案
    mssql2000 数据库一致性错误修复
    c#基础
    任务表 步骤表
    BPM事件
  • 原文地址:https://www.cnblogs.com/simplezhuo/p/9846218.html
Copyright © 2011-2022 走看看