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