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