java身份证合法性校验工具类实例代码
1.身份证规则
计算方法(来源百度)
- 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
- 将这17位数字和系数相乘的结果相加。
- 用加出来和除以11,看余数是多少?
- 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X…)
- 通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。
例如:某男性的身份证号码为【53010219200508011x】,我们看看这个身份证是不是合法的身份证。
首先我们得出前17位的乘积和【(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)】是189,然后用189除以11得出的结果是189/11=17----2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。
2.代码逻辑
本工具类提供了3种类型校验:
- 18位身份证号码校验
- 15位身份证号码校验(方法验证不准确)
- 15位转18位身份证号码校验
18位身份证号合法性:
- 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
- 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
- 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
- 前1、2位数字表示:所在省份的代码;2.第3、4位数字表示:所在城市的代码;3.第5、6位数字表示:所在区县的代码;
- 第7~14位数字表示:出生年、月、日;5.第15、16位数字表示:所在地的派出所的代码;
- 第17位数字表示性别:奇数表示男性,偶数表示女性;
- 第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。
3.代码
此工具类可以直接拷贝使用并且提供了main方法进行测试
/** **类说明:身份证合法性校验 *
**--15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。 *--18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。 *
*/ /** *@Description:身份证校验工具类 *@author:xuxinku *@Date:2020/9/0710:55 *@ModifiedDate: *@Copyright:xx保险股份有限公司 */ @SuppressWarnings({"unchecked","unused","all"}) publicclassIdcardValidator{ /** *省,直辖市代码表:{11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古", *21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏", *33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南", *42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆", *51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃", *63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} */ protectedStringcodeAndCity[][]={{"11","北京"},{"12","天津"}, {"13","河北"},{"14","山西"},{"15","内蒙古"},{"21","辽宁"}, {"22","吉林"},{"23","黑龙江"},{"31","上海"},{"32","江苏"}, {"33","浙江"},{"34","安徽"},{"35","福建"},{"36","江西"}, {"37","山东"},{"41","河南"},{"42","湖北"},{"43","湖南"}, {"44","广东"},{"45","广西"},{"46","海南"},{"50","重庆"}, {"51","四川"},{"52","贵州"},{"53","云南"},{"54","西藏"}, {"61","陕西"},{"62","甘肃"},{"63","青海"},{"64","宁夏"}, {"65","新疆"},{"71","台湾"},{"81","香港"},{"82","澳门"}, {"91","国外"}}; privateStringcityCode[]={"11","12","13","14","15","21","22", "23","31","32","33","34","35","36","37","41","42","43", "44","45","46","50","51","52","53","54","61","62","63", "64","65","71","81","82","91"}; //每位加权因子 privateintpower[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //第18位校检码 privateStringverifyCode[]={"1","0","X","9","8","7","6","5", "4","3","2"}; /** *验证所有的身份证的合法性 *@paramidcard *@return */ publicbooleanisValidatedAllIdcard(Stringidcard){ if(idcard.length()==15){ idcard=this.convertIdcarBy15bit(idcard); } returnthis.isValidate18Idcard(idcard); } /** **判断18位身份证的合法性 *
*根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。 *排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 **顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 *
**1.前1、2位数字表示:所在省份的代码;2.第3、4位数字表示:所在城市的代码;3.第5、6位数字表示:所在区县的代码; *4.第7~14位数字表示:出生年、月、日;5.第15、16位数字表示:所在地的派出所的代码; *6.第17位数字表示性别:奇数表示男性,偶数表示女性; *7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。 *
**第十八位数字(校验码)的计算方法为:1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7910584 *216379105842 *
**2.将这17位数字和系数相乘的结果相加。 *
**3.用加出来和除以11,看余数是多少? *
*4.余数只可能有012345678910这11个数字。其分别对应的最后一位身份证的号码为10X9876543 *2。 **5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 *
* *@paramidcard *@return */ publicbooleanisValidate18Idcard(Stringidcard){ //非18位为假 if(idcard.length()!=18){ returnfalse; } //获取前17位 Stringidcard17=idcard.substring(0,17); //获取第18位 Stringidcard18Code=idcard.substring(17,18); charc[]=null; StringcheckCode=""; //是否都为数字 if(isDigital(idcard17)){ c=idcard17.toCharArray(); }else{ returnfalse; } if(null!=c){ intbit[]=newint[idcard17.length()]; bit=converCharToInt(c); intsum17=0; sum17=getPowerSum(bit); //将和值与11取模得到余数进行校验码判断 checkCode=getCheckCodeBySum(sum17); if(null==checkCode){ returnfalse; } //将身份证的第18位与算出来的校码进行匹配,不相等就为假 if(!idcard18Code.equalsIgnoreCase(checkCode)){ returnfalse; } } returntrue; } /** *验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。 * *@paramidcard *@return */ publicbooleanisValidate15Idcard(Stringidcard){ //非15位为假 if(idcard.length()!=15){ returnfalse; } //是否全都为数字 if(isDigital(idcard)){ Stringprovinceid=idcard.substring(0,2); Stringbirthday=idcard.substring(6,12); intyear=Integer.parseInt(idcard.substring(6,8)); intmonth=Integer.parseInt(idcard.substring(8,10)); intday=Integer.parseInt(idcard.substring(10,12)); //判断是否为合法的省份 booleanflag=false; for(Stringid:cityCode){ if(id.equals(provinceid)){ flag=true; break; } } if(!flag){ returnfalse; } //该身份证生出日期在当前日期之后时为假 Datebirthdate=null; try{ birthdate=newSimpleDateFormat("yyMMdd").parse(birthday); }catch(ParseExceptione){ e.printStackTrace(); } if(birthdate==null||newDate().before(birthdate)){ returnfalse; } //判断是否为合法的年份 GregorianCalendarcurDay=newGregorianCalendar(); intcurYear=curDay.get(Calendar.YEAR); intyear2bit=Integer.parseInt(String.valueOf(curYear) .substring(2)); //判断该年份的两位表示法,小于50的和大于当前年份的,为假 if((year<50&&year>year2bit)){ returnfalse; } //判断是否为合法的月份 if(month<1||month>12){ returnfalse; } //判断是否为合法的日期 booleanmflag=false; curDay.setTime(birthdate);//将该身份证的出生日期赋于对象curDay switch(month){ case1: case3: case5: case7: case8: case10: case12: mflag=(day>=1&&day<=31); break; case2://公历的2月非闰年有28天,闰年的2月是29天。 if(curDay.isLeapYear(curDay.get(Calendar.YEAR))){ mflag=(day>=1&&day<=29); }else{ mflag=(day>=1&&day<=28); } break; case4: case6: case9: case11: mflag=(day>=1&&day<=30); break; } if(!mflag){ returnfalse; } }else{ returnfalse; } returntrue; } /** *将15位的身份证转成18位身份证 * *@paramidcard *@return */ publicStringconvertIdcarBy15bit(Stringidcard){ Stringidcard17=null; //非15位身份证 if(idcard.length()!=15){ returnnull; } if(isDigital(idcard)){ //获取出生年月日 Stringbirthday=idcard.substring(6,12); Datebirthdate=null; try{ birthdate=newSimpleDateFormat("yyMMdd").parse(birthday); }catch(ParseExceptione){ e.printStackTrace(); } Calendarcday=Calendar.getInstance(); cday.setTime(birthdate); Stringyear=String.valueOf(cday.get(Calendar.YEAR)); idcard17=idcard.substring(0,6)+year+idcard.substring(8); charc[]=idcard17.toCharArray(); StringcheckCode=""; if(null!=c){ intbit[]=newint[idcard17.length()]; //将字符数组转为整型数组 bit=converCharToInt(c); intsum17=0; sum17=getPowerSum(bit); //获取和值与11取模得到余数进行校验码 checkCode=getCheckCodeBySum(sum17); //获取不到校验位 if(null==checkCode){ returnnull; } //将前17位与第18位校验码拼接 idcard17+=checkCode; } }else{//身份证包含数字 returnnull; } returnidcard17; } /** *15位和18位身份证号码的基本数字和位数验校 * *@paramidcard *@return */ publicbooleanisIdcard(Stringidcard){ returnidcard==null||"".equals(idcard)?false:Pattern.matches( "(^\\d{15}$)|(\\d{17}(?:\\d|x|X)$)",idcard); } /** *15位身份证号码的基本数字和位数验校 * *@paramidcard *@return */ publicbooleanis15Idcard(Stringidcard){ returnidcard==null||"".equals(idcard)?false:Pattern.matches( "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$", idcard); } /** *18位身份证号码的基本数字和位数验校 * *@paramidcard *@return */ publicbooleanis18Idcard(Stringidcard){ returnPattern .matches( "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$", idcard); } /** *数字验证 * *@paramstr *@return */ publicbooleanisDigital(Stringstr){ returnstr==null||"".equals(str)?false:str.matches("^[0-9]*$"); } /** *将身份证的每位和对应位的加权因子相乘之后,再得到和值 * *@parambit *@return */ publicintgetPowerSum(int[]bit){ intsum=0; if(power.length!=bit.length){ returnsum; } for(inti=0;i总结
到此这篇关于java身份证合法性校验工具类的文章就介绍到这了,更多相关java身份证合法性校验工具类内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。