银行卡号码校验算法(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 ...
随机推荐
- 公钥与私钥的理解,以及https的应用原理
1.公钥与私钥原理1)鲍勃有两把钥匙,一把是公钥,另一把是私钥2)鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把.3)苏珊要给鲍勃写一封保密的信.她写完后用鲍勃的公钥加密,就可以达到 ...
- 通过sqli-labs学习sql注入——基础挑战之less1
环境准备: Phpstudy (PHP+Apache+Mysql) Sql-lab 首先了解下基础知识: URL编码: 因为在浏览器中,当我们访问一个网址的时候,浏览器会自动将用户输入的网址进行UR ...
- LeetCode 463. Island Perimeter岛屿的周长 (C++)
题目: You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 repr ...
- 爬虫项目之NABC
Need 在如今的互联网市场上相关的网络爬虫软件已然很多,要想赢得客户,高效.稳定.创新都必不可少的. 我们初步阅读和运行了上一届团队的项目,决定从以下几个方面修改和完善创新这一项目: 1.改善对爬取 ...
- Linux内核分析(第二周)
操作系统是如何工作的? 一.总结:三大法宝 1.存储程序计算机 + 函数调用堆栈 + 中断机制 2.堆栈:C语言程序运行时候必须的一个记录调用路径和参数的空间(函数调用框架/提供局部变量/传递参数/保 ...
- git的使用与学习
1.将本地项目推送到Github $ git remote add origin 仓库地址 // 关联远程仓库 $ git push origin master // 推送到远程仓库 如果远程仓库有本 ...
- Beta吐槽
目录 感想 管理团队 推进项目 pm吐槽 开发 经过我慎重的考虑,我jio得,Beta版本的吐槽还是不能少. 感想 管理团队 这学期十分庆幸成为我们这个这么优秀的团队的pm.身在pm的位置上经历这么一 ...
- PHP随机函数rand()、mt_rand()、srand()、mt_srand() 的区别
1.生成随机数发生器种子的函数 srand(). mt_srand() 区别:mt_srand() 比 srand() 更好的生成随机数发生器种子 定义: void srand([int $seed ...
- Oracle DROPtable以及Truncate table 的简单测试
1. 一个用户库 有一个业务表比较大 大小是 49g 表的行数为:121546147 一亿两千万行 制作一个虚拟机的快照测试一下 drop table 和 truncate table的性能差距 2. ...
- [转帖]Docker里运行Docker docker in docker(dind)
Docker里运行Docker docker in docker(dind) http://www.wantchalk.com/c/devops/docker/2017/05/24/docker-in ...