校验银行卡号是否符合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

方法二:

待续...

猜你喜欢

转载自www.cnblogs.com/simplezhuo/p/9846218.html
今日推荐