博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
校验银行卡号是否符合Luhn算法及生成符合Luhn算法的银行卡号
阅读量:5153 次
发布时间:2019-06-13

本文共 2249 字,大约阅读时间需要 7 分钟。

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

 

转载于:https://www.cnblogs.com/simplezhuo/p/9846218.html

你可能感兴趣的文章
大咖专栏 | DevOps组织如何有效地实施MSA
查看>>
工厂模式
查看>>
忍不住了, 和大家聊聊怎么写简历吧, 关于简历的深度思考
查看>>
高并发编程
查看>>
(前端)html与css css 19、tab栏
查看>>
一起来学习.net core程序使用中介者模式:MediatR插件
查看>>
debian9 设置
查看>>
5句话搞定ES5作用域
查看>>
Build tool
查看>>
php 小坑记录
查看>>
2018.7.28 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)
查看>>
通过 poi 导入 Excel代码
查看>>
《CSS基础教程》 读书笔记三
查看>>
洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
查看>>
PHP安全新闻早8点_1127
查看>>
57.Insert Interval
查看>>
PHP 五大运行模式
查看>>
CSS选项卡
查看>>
HDOJ1203 I NEED A OFFER!
查看>>
ZH奶酪:自然语言处理工具LTP语言云调用方法
查看>>