Luhn是著名的校验和算法也叫模10算法,主要应用于解决银行卡号,社保号等重要信息传输出错问题。
先来解释下算法原理,校验和类型的算法,一般是ID+校验号,校验号和ID号的每位相关,如果出错,通过某种运算能检测出这种改动。借用维基百科的例子我来解释下。
我们以数字“7992739871”为例,计算其校验位:
- 从校验位开始,从右往左,偶数位乘2(例如,7*2=14),然后将两位数字的个位与十位相加(例如,10:1+0=1,14:1+4=5);
- 把得到的数字加在一起(本例中得到67);
- 将数字的和取模10(本例中得到7),再用10去减(本例中得到3),得到校验位。
7 | 9 | 9 | 2 | 7 | 3 | 9 | 8 | 7 | 1 | x |
7 | 18 | 9 | 4 | 7 | 6 | 9 | 16 | 7 | 2 | x |
7 | 9 | 9 | 4 | 7 | 6 | 9 | 7 | 7 | 2 | =67 |
OK,解释到这里,那么跟我们有什么相关呢,最常见的例子就是银行卡号,我们的银行卡号其实最后一位都是由该算法得出的校验码,校验码不用我们算了,我们只要从低位向高位(包括校验和),偶数位做上述转化,然后每位加在一起,必然满足%10==0,否则校验失败,下面是我实现的Luhn类,主要功能是校验和生成校验码。
public class Luhn { private int[] no; private Boolean isValidate = null; public Luhn(String strno) { this(convertStrToInArr(strno)); } public Luhn(int[] no) { if(null!=no && no.length>0) { this.no = Arrays.copyOf(no, no.length); for(int i=0;i<no.length;i++) { if(no[i]<0) { throw new IllegalArgumentException("No can not contain negtive value"); } } }else{ throw new IllegalArgumentException("No is null or Empty"); } } /** * 校验 * @return */ public boolean check() { if(null == isValidate) { isValidate = luhnCheck(getCardNoArr()); } return isValidate; } /** * 获取全部id * @return */ public int[] getCardNoArr() { return Arrays.copyOf(no, no.length); } /** * 计算校验和的算法 * @return */ public int getCheckSum(){ if(check()) { return no[0]; } int[] cardNoArr = getCardNoArr(); for(int i=0;i<cardNoArr.length;i+=2) { cardNoArr[i] <<= 1; cardNoArr[i] = cardNoArr[i]/10 + cardNoArr[i]%10; } int sum = 0; for(int i=0;i<cardNoArr.length;i++) { sum += cardNoArr[i]; //System.out.print(cardNoArr[i]); } return sum * 9 % 10; } private static int[] convertStrToInArr(String cardNo) { if(null==cardNo)throw new IllegalArgumentException(); int index = cardNo.length(); int[] cardNoArr = new int[cardNo.length()]; for(char c : cardNo.toCharArray()) { cardNoArr[--index] = c - '0'; } return cardNoArr; } /** * 校验的具体算法实现 * @param cardNoArr * @return */ private static boolean luhnCheck(int[] cardNoArr) { for(int i=1;i<cardNoArr.length;i+=2) { cardNoArr[i] <<= 1; cardNoArr[i] = cardNoArr[i]/10 + cardNoArr[i]%10; } int sum = 0; for(int i=0;i<cardNoArr.length;i++) { sum += cardNoArr[i]; //System.out.print(cardNoArr[i]); } return sum % 10 == 0; } }
相关推荐
银行卡校验规则(Luhn算法)--JDK1.7下双击运行即可,详情参看https://zhuanlan.zhihu.com/p/26939610
银行卡号Luhn校验算法的JS实现.pdf
Luhn计算模10 “隔位2倍加”校验数的公式 计算步骤如下: 1、从右边第一个数字(低序)开始每隔一位乘以2。 2、把在步骤1中获得的乘积的各位数字与原号码中位乘2的各位数字相加求和。 3、从步骤2中获得的数字邻近的...
下面小编就为大家带来一篇判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
基于国内银行卡号制定规则,因为目前接触到的银行项目需要用到客户端校验银行卡号,故自己用js写了一个Luhm校验算法,不足之处还望各位大侠赐教!
纯C语言实现的Luhn算法(信用卡校验位) 示例 C 函数“check_number()”用于检查任意长度的数字字符串,在字符串末尾使用 Luhn 校验位加上示例 C 函数“calc_digit()”以计算给定字符串的校验位字符。示例“main”C...
ObjectiveLuhn, Luhn信用卡验证算法 Luhn算法 这是Luhn算法的一个端口,通常用于验证信用卡详细信息,objective-c ( iOS ) 。在 https://github.com/MaxKramer/SwiftLuhn 可以找到快速端口。简单地调用单
当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
LUHN和MD5数据机密算法的VBS实现
Luhn算法工具,实现对输入附加校验码,检查带校验码字符串是否合法
按照ISO 2894中支付卡校验位的算法 The Luhn Mod-10 Method 规定: 1、对卡号上的每位数字乘以权重。其规则是,如果卡号数字个数是偶数,则第一位乘以2,否则就乘以1,然后以后分别是,1,2,1,2,1,2;2、如果每位数字...
Luhn算法Java中Luhn算法的实现
Kotlin中luhn 检查算法的快速简单的就地实现
Luhn Mod N算法JavaScript实现 Luhn mod N算法是Luhn算法(也称为mod 10算法)的扩展,允许它处理非数字字符序列。 当需要使用校验位来验证由字母,字母和数字的组合甚至任何任意字符集组成的标识字符串时,这将很...
Luhn算法的Java实现 将jLuhn添加到您的项目 玛文 添加以下存储库: <id>jitpack.io <url>https://jitpack.io</url> 和以下依赖项: <groupId>com.github.Olverine</groupId> <artifactId>jLuhn ...
主要介绍了Python3通过Luhn算法快速验证信用卡卡号的方法,涉及Python中Luhn算法的使用技巧,非常简单实用,需要的朋友可以参考下
LUHN算法的作用是为了计算信用卡等证件号码的合法性
检查14、15或16位数字卡号,以确定该数字是否符合Luhn的要求。 有关公式的详细信息,请参见: : 其中cardNumber用作帐号(以字符串形式接收) 没有空格或分隔符: 以下数字可作为一个可验证的示范cardNumber ='...