【注: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 方法二: 待续...