验证18位身份证号最后一位校验码是否正确
?
import java.util.HashMap;import java.util.List;import java.util.Map;public class MyUtil {/*** 本方法能验证18位身份证号最后一位校验码是否正确,* 从而得知身份证是否真实* @param originId 身份证号* @return*/public static boolean checkCHINA_ID(String originId) {String lastDigit=originId.substring(originId.length()-1);//记下最后一位String tempId=originId.substring(0, originId.length()-1);long destId=new Long(tempId);System.out.println("tempId:"+tempId);System.out.println("last digit:"+lastDigit);long bb=0;//和系数相乘的加总和//step1用到的系数int cc[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};int i=cc.length;//初始化基准值map,为step4做准备int key[]={0,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10};// char value[]={'1','0','X','9','8','7','6','5','4','3','2'};String value[]={"1","0","X","9","8","7","6","5","4","3","2"};// System.out.println(key.length+"-------------"+value.length);Map map=new HashMap();for(int j=0;j<key.length;j++) {map.put(key[j], value[j]);}while(i>0) {int temp=cc[--i];// System.out.println(destId%10+"-------------"+temp);//step 1:分别乘以系数 step2:相加bb+=(destId%10)*temp;destId=destId/10;}System.out.println(bb);//step 3:除以11,得余数int left=(int)(bb%11);System.out.println("余数:"+left);//step 4.1:取得基准值Object digitValue=map.get(left);System.out.println("基准值:"+digitValue.toString());//step 4.2:做比较,返回结果boolean flag=digitValue.equals(lastDigit);System.out.println("想不相同:"+flag);return flag;}/*** @param args*/public static void main(String[] args) {String aa="34052419800101001X";System.out.println("合法么:"+checkCHINA_ID(aa));}}???附:(来自百度?http://zhidao.baidu.com/question/13906611.html)
大陆的身份证为18位,老的身份证是15位。?
关于身份证第18是怎么计算的,原理如下:根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。?
地址码(身份证前六位)表示编码对象常住户口所在县(市、旗、区)的行政区划代码。(所有区域的编码可以到这个网站http://www.stats.gov.cn/tjbz/index.htm?
查询到最新的县及县以上的行政编码资料。)?
生日期码(身份证第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。?
顺序码(身份证第十五位到十七位)为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。?
校验码(身份证最后一位)是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。?
?