银行卡号码校验算法(Luhn算法,又叫模10算法)
有时候在网上办理一些业务时有些需要填写银行卡号码,当胡乱填写时会立即报错,但是并没有发现向后端发送请求,那么这个效果是怎么实现的呢。
对于银行卡号有一个校验算法,叫做Luhn算法。
一、银行卡号码的校验规则
银行卡号码的校验采用Luhn算法,校验过程大致如下:
1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….
2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。
3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。
4. 如果s能够整除10,则此号码有效,否则号码无效。
因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法。
校验算法比较简单,一个python的实现:
#! /usr/bin/python3
# -*- coding: utf-8 -*- def luhn(card_num):
s = 0
card_num_length = len(card_num)
for _ in range(1, card_num_length + 1):
t = int(card_num[card_num_length - _])
if _ % 2 == 0:
t *= 2
s += t if t < 10 else t % 10 + t // 10
else:
s += t
return s % 10 == 0 if __name__ == '__main__':
print(luhn('6226095711989751'))
二、生成符合Luhn规则的银行卡号测试数据
前面既然摸清了银行卡号的校验规则,那么就可以根据此规则生成一些能够通过Luhn校验的测试数据。
思路:
因为最右边的一位是奇数位,奇数位不需要改变值直接放啥就是啥,这个特性很重要,正好可以用来补齐到正好能够整除10。
所以显然能够推测出生成n位符合Luhn规则的算法:
1. 随机生成n-1位字符,称为字符串x。
2. 先假设字符串x有n位(实际上最右边一位缺失是n-1位),将x按照n位长度计算和s,因为最右边第一位是缺失的,忽略跳过,所以计算时最右边一位从2开始。
3. 上一步得到字符串x的校验和s,将s加上一个数字y,使得它正好可以整除10,这个y就是最右边第一位应该放的数字。
4. x+y做字符串拼接运算,得到最终的n位符合Luhn规则的字符串。
实现代码:
#! /usr/bin/python3
# -*- coding: utf-8 -*- import random def gen_card_num(start_with, total_num):
result = start_with # 随机生成前N-1位
while len(result) < total_num - 1:
result += str(random.randint(0, 9)) # 计算前N-1位的校验和
s = 0
card_num_length = len(result)
for _ in range(2, card_num_length + 2):
t = int(result[card_num_length - _ + 1])
if _ % 2 == 0:
t *= 2
s += t if t < 10 else t % 10 + t // 10
else:
s += t # 最后一位当做是校验位,用来补齐到能够整除10
t = 10 - s % 10
result += str(0 if t == 10 else t)
return result def luhn(card_num):
s = 0
card_num_length = len(card_num)
for _ in range(1, card_num_length + 1):
t = int(card_num[card_num_length - _])
if _ % 2 == 0:
t *= 2
s += t if t < 10 else t % 10 + t // 10
else:
s += t
return s % 10 == 0 if __name__ == '__main__':
for _ in range(1000):
random_card_num = gen_card_num('622609', 16)
valid_result = luhn(random_card_num)
print('%s %s' % (random_card_num, valid_result))
三、小结
1. 在开发需要填写银行卡号的表单时,最好能够在前端加上一层Luhn校验,以将大部分的非法输入在前端就拦截过滤掉。
2. 在需要一些银行卡号测试数据时,可以使用上面的代码生成一些合法的银行卡号作为测试数据。
3. 明白了这些之后以后转账再输卡号不用那么担心了,因为如果不小心输错了一位的话能够校验出来的,当然理论上是这样的,但对于我这样的穷人十块钱以上的高额交易就得确认好几次…
相关资料:
.
银行卡号码校验算法(Luhn算法,又叫模10算法)的更多相关文章
- [技术栈]C#利用Luhn算法(模10算法)对IMEI校验
1.Luhn算法(模10算法) 通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图: 算法主要分为三步: 第一步:从右边第一位(最低位)开始隔位乘2: 第二步:把 ...
- LUHN 模10 算法 银行卡校验
信用卡Luhn算法(模10)具体的校验过程如下: 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 ...
- RSA算法的C++string实现(模幂算法和欧几里得算法的使用)后附思路
void resetNumA(string numAStr); //使用string重置numB void resetNumB(string numBStr); //将数组转换为字符串,用于输出 st ...
- RSA简介(二)——模幂算法
RSA最终加密.解密都要用到模乘的幂运算,简称模幂运算. 回忆一下RSA,从明文A到B B=Ae1%N 对B解密,就是 A=Be2%N 其中,一般来说,加密公钥中的e1一般会比较小,取65537居多, ...
- 数模常用算法系列Matlab实现-----线性规划
线性规划的 Matlab 标准形式 线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是小于号也可以是大于号.为了避免这种形式多样性带来的不便,Matlab 中规定线性 规划的标 ...
- miller_rabin算法检测生成大素数的RSA算法实现
import math from functools import reduce #用于合并字符 from os import urandom #系统随机的字符 import binascii # ...
- EM算法(2):GMM训练算法
目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法运用 EM算法(4):EM算法证明 EM算法(2):GMM训练算法 1. 简介 GMM模型全称为Ga ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
- 70 数组的Kmin算法和二叉搜索树的Kmin算法对比
[本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Km ...
随机推荐
- 12.17daily_scrum
悬浮窗的优化设计工作已经展开,各界面的测试也在有条不紊的进行,大家都尽量做到了在发现了软件自身的一些问题和bug后,做到在第一时间及时恢复和修改,工作进度的安排也在预期之中,明日的任务发布如下: 具体 ...
- 【MOOC EXP】Linux内核分析实验五报告
程涵 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 分析system_call中断处理过程 ...
- 软件项目第一次sprint评分表
- Data Plane
2015-2018,部分关于SDN数据平面的故障恢复文献粗读 SHEAR: A highly available and flexible network architecture marrying ...
- level3
伸冤下:老师的评论是有看到!看完我就去修改程序了,忘记回复请原谅!= = 前阵子都在修改功能和思路,但是由于一个细节的错误找不到,导致没有成品可以上传...求谅解. 细心真的很重要 = =!!! im ...
- Beta 冲刺 六
团队成员 051601135 岳冠宇 031602629 刘意晗 031602248 郑智文 031602330 苏芳锃 031602234 王淇 照片 项目进展 岳冠宇 昨天的困难 ActionBa ...
- Docker(二十五)-Docker Machine
Docker Machine 是什么? Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在 ...
- mybatis 传递参数的两种方式与模糊匹配 很重要
- 【BZOJ2067】SZN(二分,动态规划,贪心)
[BZOJ2067]SZN(二分,动态规划,贪心) 题面 权限题额 Description String-Toys joint-stock 公司需要你帮他们解决一个问题. 他们想制造一个没有环的连通图 ...
- 【枚举Day1】20170529-2枚举算法专题练习 题解
题目: http://www.cnblogs.com/ljc20020730/p/6918328.html 评测器:cena 评测记录: 1.OneMoreRectangle 一个矩形 ●如果任意枚举 ...