Luhn是著名的校验和算法也叫模10算法,主要应用于解决银行卡号,社保号等重要信息传输出错问题。

先来解释下算法原理,校验和类型的算法,一般是ID+校验号,校验号和ID号的每位相关,如果出错,通过某种运算能检测出这种改动。借用维基百科的例子我来解释下。

我们以数字“7992739871”为例,计算其校验位:

从校验位开始,从右往左,偶数位乘2(例如,7*2=14),然后将两位数字的个位与十位相加(例如,10:1+0=1,14:1+4=5);

把得到的数字加在一起(本例中得到67);

将数字的和取模10(本例中得到7),再用10去减(本例中得到3),得到校验位。

原始数字 偶数位乘2 将数字相加

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

=6 7

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

{

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[i] <<= 1;

cardNoArr[i] = cardNoArr[i]/10 + cardNoArr[i]%10;

}

int sum = 0;

for(int i=0;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[i] <<= 1;

cardNoArr[i] = cardNoArr[i]/10 + cardNoArr[i]%10;

}

int sum = 0;

for(int i=0;i

{

sum += cardNoArr[i];

//System.out.print(cardNoArr[i]);

}

return sum % 10 == 0;

}

}

java 银行卡号校验_java实现银行卡号校验算法luhn相关推荐

  1. java 加密工具包_Java加密和解密算法调用工具包

    软件架构及说明 1.本工具包基于纯java编写而成: 2.部分算法密钥对基于bcprov-jdk16的调用生成. 3.部分加密与解密算法来自网上公开的源码,并在此基础上进行整理和优化而来: 4.本加密 ...

  2. java crc32验证_JAVA实现CRC32校验

    CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段.在诸多检错手段中,CRC是最著名的一种.CRC的全称是循环冗余校验. 其特点是:检错能力极强,开销小,易于用 ...

  3. java xsd校验_Java使用xsd校验xml

    最近项目需要使用xsd对xml进行预校验,于是封装了一个工具类,来完成校验工作. 完整代码如下: import java.io.File; import java.io.IOException; im ...

  4. java 手机号隐藏_Java隐藏银行卡号或者手机号中间几位,用*号代替工具类实现HideDataUtil...

    方案一: public static void main(String[] args) { //$1 $2 表示正则表达式里面的第一个和第二个,也就是括号里面的内容 System.out.printl ...

  5. java密码校验_java强密码校验

    //检验密码8位以上并且包含数字.大小写字母.特殊字符四种的三种以上 package demo2; import java.util.Scanner; import java.util.regex.M ...

  6. java 音色识别_Java实现Shazam声音识别算法的实例代码

    Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频. 1.AudioSystem获取音频 奈奎斯特-香农采样定理告诉我们,为了能捕获人类能听到的声音频 ...

  7. java 下载限速_Java 文件下载限流算法

    在做文件下载功能时,为了避免下载功能将服务器的带宽打满,从而影响服务器的其他服务.我们可以设计一个限流器来限制下载的速率,从而限制下载服务所占用的带宽. 一.算法思路 定义一个数据块chunk(单位 ...

  8. java实现分而治之_java中的分而治之算法

    我必須用Java編寫一個使用分治法的 算法.給定一個數組V,其中n個int元素 該算法應該計算兩個連續出現的次數.java中的分而治之算法 例如:如果V = [3, 0, 0, 1, 0, 1, 3, ...

  9. java 二分查找_JAVA 实现二分查找算法。我知道你会,但没你想象的那么简单

    二分查找算法定义:二分查找(binary search),也称折半搜索,是一种在 有序数组 中 查找某一特定元素 的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结 ...

最新文章

  1. SLAM综述-Lidar SLAM
  2. sklearn的train_test_split()各函数参数含义解释(非常全)
  3. 高并发分布式系统中生成全局唯一(订单号)Id
  4. mysql中影响数据库性能的因素讲解
  5. 你要「老婆」不要?谷歌程序员20行代码把二次元「老婆」带到现实世界
  6. 去哪儿-16-detail-banner
  7. 【扩展欧几里得】Bzoj 1477:青蛙的约会
  8. linux 下 pytorch 安装
  9. JNDI技术、JDBC框架、几种元数据介绍
  10. 不可不知的 Android strings.xml 那些事
  11. SpringBoot中对于异常处理的提供的五种处理方式
  12. Open3d之RGBD测程法
  13. 荒野行动pc版显示连接不到服务器,荒野行动PC版连接不上服务器怎么办 进不去游戏...
  14. 双击word文档提示向程序发送命令出现问题(There was a problem sending the command to the program)
  15. 解决memoryerror
  16. 数据归一化(normalizing)的直观理解和通俗解释。
  17. 使用Java实现简单的监控系统
  18. 网页抓取/数据抽取/信息提取软件工具包MetaSeeker
  19. 初二物理模型有哪些_史上最全的初二物理复习笔记!(假期必备)
  20. ISCA 2018 论文 部分(一)

热门文章

  1. 服务器 mac系统安装教程,mac os sierra安装教程
  2. Linux网络设备驱动-以太网驱动分析
  3. java 面试 三 (java知音转)
  4. 真人表述:一个技术支持人员的兼职创业实战案例
  5. python毕业设计作品基于django框架 景区购票系统毕设成品(7)中期检查报告
  6. vs2015+win10搭开发环境
  7. Learning How to Learn
  8. 学校第一学期计算机教学总结,学校信息技术工作总结
  9. 腾讯内部转岗_即将退出历史舞台,腾讯微博将于9月28日停止服务和运营
  10. 试试程序员专用字体CascadiaCode支持连字体