java 银行卡号校验_java实现银行卡号校验算法luhn
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相关推荐
- java 加密工具包_Java加密和解密算法调用工具包
软件架构及说明 1.本工具包基于纯java编写而成: 2.部分算法密钥对基于bcprov-jdk16的调用生成. 3.部分加密与解密算法来自网上公开的源码,并在此基础上进行整理和优化而来: 4.本加密 ...
- java crc32验证_JAVA实现CRC32校验
CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段.在诸多检错手段中,CRC是最著名的一种.CRC的全称是循环冗余校验. 其特点是:检错能力极强,开销小,易于用 ...
- java xsd校验_Java使用xsd校验xml
最近项目需要使用xsd对xml进行预校验,于是封装了一个工具类,来完成校验工作. 完整代码如下: import java.io.File; import java.io.IOException; im ...
- java 手机号隐藏_Java隐藏银行卡号或者手机号中间几位,用*号代替工具类实现HideDataUtil...
方案一: public static void main(String[] args) { //$1 $2 表示正则表达式里面的第一个和第二个,也就是括号里面的内容 System.out.printl ...
- java密码校验_java强密码校验
//检验密码8位以上并且包含数字.大小写字母.特殊字符四种的三种以上 package demo2; import java.util.Scanner; import java.util.regex.M ...
- java 音色识别_Java实现Shazam声音识别算法的实例代码
Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频. 1.AudioSystem获取音频 奈奎斯特-香农采样定理告诉我们,为了能捕获人类能听到的声音频 ...
- java 下载限速_Java 文件下载限流算法
在做文件下载功能时,为了避免下载功能将服务器的带宽打满,从而影响服务器的其他服务.我们可以设计一个限流器来限制下载的速率,从而限制下载服务所占用的带宽. 一.算法思路 定义一个数据块chunk(单位 ...
- java实现分而治之_java中的分而治之算法
我必須用Java編寫一個使用分治法的 算法.給定一個數組V,其中n個int元素 該算法應該計算兩個連續出現的次數.java中的分而治之算法 例如:如果V = [3, 0, 0, 1, 0, 1, 3, ...
- java 二分查找_JAVA 实现二分查找算法。我知道你会,但没你想象的那么简单
二分查找算法定义:二分查找(binary search),也称折半搜索,是一种在 有序数组 中 查找某一特定元素 的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结 ...
最新文章
- SLAM综述-Lidar SLAM
- sklearn的train_test_split()各函数参数含义解释(非常全)
- 高并发分布式系统中生成全局唯一(订单号)Id
- mysql中影响数据库性能的因素讲解
- 你要「老婆」不要?谷歌程序员20行代码把二次元「老婆」带到现实世界
- 去哪儿-16-detail-banner
- 【扩展欧几里得】Bzoj 1477:青蛙的约会
- linux 下 pytorch 安装
- JNDI技术、JDBC框架、几种元数据介绍
- 不可不知的 Android strings.xml 那些事
- SpringBoot中对于异常处理的提供的五种处理方式
- Open3d之RGBD测程法
- 荒野行动pc版显示连接不到服务器,荒野行动PC版连接不上服务器怎么办 进不去游戏...
- 双击word文档提示向程序发送命令出现问题(There was a problem sending the command to the program)
- 解决memoryerror
- 数据归一化(normalizing)的直观理解和通俗解释。
- 使用Java实现简单的监控系统
- 网页抓取/数据抽取/信息提取软件工具包MetaSeeker
- 初二物理模型有哪些_史上最全的初二物理复习笔记!(假期必备)
- ISCA 2018 论文 部分(一)