java 身份证第18位数字的算法

原来在注册一个网站的时候,发现输入身份证会被验证出来。

即使前面的全正确,但是如果最后一位不正确的话,也会被验证出来的。

原来在身份证的号码,是有规则的。特别是最后一位。

下面是18位身份证最后一位的算法:

 
  
/**
*功能: 求18位身份证的最后一位
*
@author cfd406635982
*
*/
public class IdentityNum {

public static void main(String[] args) {
System.out.println(getLastIDNum(
" 37018319880321312 " ));
}

/**
* 名称: 计算18位身份证的最后一位
* 功能 : 根据前17位身份证号,求最后一位
* 身份证最后一位的算法:
* 1.将身份证号码的前17位的数字,分别乘以权数 : 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
* (比如:第一位乘以7,第二位乘以9,以此类推)
* 2.再将上面的所有乘积求和
* 3.将求得的和mod以11(%11),得到一个小于11的数(0到11)
* 4.然后从1 0 X 9 8 7 6 5 4 3 2几位校验码中找出最后一位的数字
* 如果得到的是0,则对应第一位:1,如果得到的是1,则对应第二位:0
* 如果得到的是2,则对应第三位:X,如果得到的是3,则对应第四位:9,以此类推
* 5.最后得到的就是身份证的最后一位
*/
public static Character getLastIDNum(String preIds) {
Character lastId
= null ;
// 当传入的字符串没有17位的时候,则无法计算,直接返回
if (preIds == null && preIds.length() < 17 ) {
return null ;
}
int [] weightArray = { 7 , 9 , 10 , 5 , 8 , 4 , 2 , 1 , 6 , 3 , 7 , 9 , 10 , 5 , 8 , 4 , 2 }; // 权数数组
String vCode = " 10X98765432 " ; // 校验码字符串
int sumNum = 0 ; // 前17为乘以权然后求和得到的数

// 循环乘以权,再求和
for ( int i = 0 ;i < 17 ;i ++ ) {
int index = Integer.parseInt(preIds.charAt(i) + "" );
sumNum
= sumNum + index * weightArray[i]; // 乘以权数,再求和
}

int modNum = sumNum % 11 ; // 求模
lastId = vCode.charAt(modNum); // 从验证码中找出对应的数

return lastId;
}
}

可能一般项目中,对于身份证的验证不是很严格。

所以一般也都不怎么验证。但是通过这个也算增长了一种知识。 呵呵。。

转载于:https://www.cnblogs.com/java-boy/archive/2011/03/04/1970980.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值