银行卡校验规则(Luhn算法)
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
则奇数、偶数位(用红色标出)分布:5432123456788881
奇数位和=35
偶数位乘以2(有些要减去9)的结果:16 2 6 1 5 7 7,求和=35。
最后35+35=70可以被10整除,认定校验通过。
import Java.util.Scanner;
//信用卡号校验算法
public class Luhn {
public static void main(String[] args) {
System.out.println("Please input your credit card number:");
Scanner input = new Scanner(System.in);
int sumOdd = 0;
int sumEven = 0;
String number = input.next();
int length = number.length();
int[] wei = new int[length];
for (int i = 0; i < number.length(); i++) {
wei[i] = Integer.parseInt(number.substring(length - i - 1, length
- i));// 从最末一位开始提取,每一位上的数值
System.out.println("第" + i + "位数字是:" + wei[i]);
}
for (int i = 0; i < length / 2; i++) {
sumOdd += wei[2 * i];
if ((wei[2 * i + 1] * 2) > 9)
wei[2 * i + 1] = wei[2 * i + 1] * 2 - 9;
else
wei[2 * i + 1] *= 2;
sumEven += wei[2 * i + 1];
}
System.out.println("奇数位的和是:" + sumOdd);
System.out.println("偶数位的和是:" + sumEven);
if ((sumOdd + sumEven) % 10 == 0)
System.out.println("Recept.");
else
System.out.println("Can not recept.");
}
}
运行结果:
Please input your credit card number:
5432123456788881
第0位数字是:1
第1位数字是:8
第2位数字是:8
第3位数字是:8
第4位数字是:8
第5位数字是:7
第6位数字是:6
第7位数字是:5
第8位数字是:4
第9位数字是:3
第10位数字是:2
第11位数字是:1
第12位数字是:2
第13位数字是:3
第14位数字是:4
第15位数字是:5
奇数位的和是:35
偶数位的和是:35
Recept.
银行卡校验规则(Luhn算法)
Luhn
检验数字算法(Luhn Check Digit Algorithm),也叫做模数10公式,是一种简单的算法,用于验证银行卡、信用卡号码的有效性的算法。对所有大型信用卡公司发行的信用卡都起作用,这些公司包括美国Express、护照、万事达卡、Discover和用餐者俱乐部等。这种算法最初是在20世纪60年代由一组数学家制定,现在Luhn检验数字算法属于大众,任何人都可以使用它。
算法:将每个奇数加倍和使它变为单个的数字,如果必要的话通过减去9和在每个偶数上加上这些值。如果此卡要有效,那么,结果必须是10的倍数。
比如上图的卡号为3759 8765 4321 001 (15位),从最高位开始所有的奇数位相加,偶数为乘以2相加(偶数乘以2后如果大于10则两位数相加),把这些奇数和偶数都加在一起得到57.
(57+3)%10 ==0 如果此卡满足被10整除,则有效位必定为3。
针对目前提现成功(clear_success)的记录里面,统计卡号的位数和数量关系如下:
卡号位数数量
<13 3038+
14 538
15 476
16 10884
17 68
18 4395
19 38070
>20 504+
说明:
位数少于14的卡号基本是外资银行,或小银行。
***496748*** ** HSBC HSBCHKHHHKH
***430259*** ** HSBC HSBCHKHHHKH
***51878018*** ** Bank of East Asia Limited BEASHKHHXXX
位数多于23的卡号大多是卡号包含字母或空格。
62270014 **** 0045 *** CHINA CONSTRUCTION BANK **
601382700 **** 9077 ** BANK OF CHINA FOSHAN BRANCH **
如果是国内的主流银行(中、农、工、建、招、交等)基本都是基于16位或者19位的卡号。
来看看提现成功(clear_success)里面的卡有多少满足Luhn规则
针对16位美元个人用户 准确率:99.84%
正确的卡号数量:3105 不正确的卡号数量 :14
卡号45806509689007** is NOT valid
卡号48620375555016** is NOT valid
卡号54202100231152** is NOT valid
卡号58890201075786** is NOT valid
卡号62106200000456** is NOT valid
卡号62129986037235** is NOT valid
卡号62252017026526** is NOT valid
.....
针对19位美元个人用户 准确率:99.96%
正确的卡号数量:10574 不正确的卡号数量 :13 其中3笔发生退票
卡号60138214000567721** is NOT valid
卡号60138217000662109** is NOT valid
卡号60138220005824282** is NOT valid
卡号60138220006014219** is NOT valid
卡号60220001386050410** is NOT valid
卡号62161132000004484** is NOT valid
卡号62220212082154900** is NOT valid
卡号62220836020035821** is NOT valid
卡号63214140980000000** is NOT valid
以上都是提现成功的卡号,可以看到基本都严格满足Luhn算法。
卡号位数数量
15 1
16 149
17 4
18 64
19 502
20 3
正确的卡号数量:622
不正确的卡号数量:29 + 1 +4+64+3
14%卡填写违法了Luhn算法,也就是这部分卡号都是可以提前通过Luhn校验发现的。
结论是我们可以在填写收款账户的时候,添加一种Luth算法的JS脚本检查用户填写的卡号存在问题。当然即时用户填写的卡号违法了该规则,我们仍然运行用户填写,但给出相应的警示内容(可能填错)。
目前在收银台页面(Checkout.vm)针对信用卡的交易,校验的JS :isValidCardfunction函数就包含了Luth校验规则,必须严格按照该规则的卡才能提交表单。
银行卡校验规则(Luhn算法)相关推荐
- c语言luhn算法生成校验位,银行卡号码校验算法(Luhn算法,又叫模10算法)
本文最后更新于2019-10-27,已超过 1年没有更新,如果文章内容.图片或者下载资源失效,请留言反馈,我会及时处理,谢谢! 温馨提示:本文共1927个字,读完预计5分钟. 有时候在网上办理一些业务 ...
- Java银行卡校验API
银行卡号有一个校验算法,叫做Luhn算法. 银行卡号码的校验规则 银行卡号码的校验采用Luhn算法,校验过程大致如下: 1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位 ...
- 银行卡编码规则及检验算法详解
转载:https://blog.csdn.net/wmlml/article/details/54345413 一.银行卡结构 XXXXXX XXXXXXXXXXXX X 发卡行标识代码 自定义位 校 ...
- js luhn算法_判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验
开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...
- 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验
开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...
- 银行卡号校验位的LUHN算法模10“隔位2倍加”校验数的公式
银联卡卡号由三部分组成:发卡机构标识码(bin).发卡机构自定义位.校验码.其中,卡号左起前六位是发卡机构标识代码(BIN),由6位数字组成.BIN号由中国银联复制分配.确认和管理:卡号第七位起事发卡 ...
- php 卡号算法,PHP实现通过Luhn算法校验信用卡卡号是否有效_PHP
本文实例讲述了PHP实现通过Luhn算法校验信用卡卡号是否有效的方法.分享给大家供大家参考.具体实现方法如下: $numbers = "49927398716 49927398717 123 ...
- 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。 该校验的过程:1、从卡号最后一位数字开始,逆
import java.util.Scanner;/*** 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,* 因为并不是一个随便的信用卡号码都是合法的,它必须通过Luh ...
- PHP中使用Luhn算法校验信用卡及借记卡卡号
Luhn算法会通过校验码对一串数字进行验证,校验码通常会被加到这串数字的末尾处,从而得到一个完整的身份识别码. 我们以数字"7992739871"为例,计算其校验位: 从校验位开始 ...
最新文章
- 远程办公时,有哪些提高沟通效率的技巧?
- html做旋转的五角星,如何用几何画板制作旋转的五角星
- NA-NP-IE系列实验30:CHAP 认证
- linux基础篇-系统中进程相关概念
- micropython webrepl_4-5 MicroPython WebREPL 命令行交互环境设置-2 接入点模式
- 植物大战僵尸模式修改
- 5. 用 PHP 源码操作 memcache(2)
- Flyweight模式
- word给表头和图题按章节编号
- AT91SAM9260使用SAM-BA调试BOOT程序
- 学报格式和论文格式一样吗_工大学报论文格式要求
- (附源码)计算机毕业设计SSM-志愿者管理系统
- Python 获取车票信息
- Greenplum源码编译安装
- CTF基础知识与web信息泄露下的目录遍历、PHPINFO、备份文件下载
- php实现支付宝二维码支付
- HTML5的优势,语法变化以及基础常用标签
- Java 基础语法知识 - 万丈高楼平地起
- 财务报告及会计基础知识
- Python实现照片、视频一键压缩及备份源代码
热门文章
- 硬件设计10---什么是频域?
- 努力成为:自我燃烧型人
- 以太坊硬分叉升级在即,这几件事情你必须知道
- 斗鱼TV如何默认HTML,斗鱼直播怎么设置标签
- python - 在线答题程序
- 解题-->在线OJ(十一)
- 我的世界服务器修复地图指令,我的世界怎样用指令清空地图上的全部方块 | 手游网游页游攻略大全...
- java spring cloud 企业电子招标采购系统源码
- 一键解决你“python卸载不干净怎么再重新安装”的烦恼
- blktrace,blkparse,btt工具的制作和使用