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; } }

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

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

你可能感兴趣的:(java,算法)