中华人民共和国公民身份证验证和计算方式
2016-04-06 15:18
387 查看
我国的公民身份证统一为18为数字,按照地址码+生日+顺序码+校验码组成。
123456 19991111 111 4
地址码 生日 顺序码 校验码
地址码指的是公民常住户口所在县(市、镇、区)的行政区划代码,如110102是北京市西城区。
出生日期码表示公民出生的公历年(4位)、月(2位)、日(2位)。
顺序码是给同地址码同出生日期码的人编定的顺序号,其中奇数分配给男性,偶数分配给女性。
最后一位是校验码,这里采用的是ISO 7064:1983,MOD 11-2校验码系统。校验码为一位数,但如果最后采用校验码系统计算的校验码是“10”,碍于身份证号码为18位的规定,则以“X”代替校验码“10”。
123456 19991111 111 4
地址码 生日 顺序码 校验码
地址码指的是公民常住户口所在县(市、镇、区)的行政区划代码,如110102是北京市西城区。
出生日期码表示公民出生的公历年(4位)、月(2位)、日(2位)。
顺序码是给同地址码同出生日期码的人编定的顺序号,其中奇数分配给男性,偶数分配给女性。
最后一位是校验码,这里采用的是ISO 7064:1983,MOD 11-2校验码系统。校验码为一位数,但如果最后采用校验码系统计算的校验码是“10”,碍于身份证号码为18位的规定,则以“X”代替校验码“10”。
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * 校验身份证号 * Created by duwenlei on 2016/4/6. * 123456 19991111 444 1 * 区码 生日 顺序码 校验码 * * 其中校验码通过计算得出 */ public class TestIdNumValidation { public static String validationNum(String idNum){ String birthDayStr = idNum.substring(6,14); SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd"); try{ Date birthDay = sf.parse(birthDayStr); Calendar calendar = new GregorianCalendar(); calendar.setTime(birthDay); if(calendar.get(Calendar.YEAR)<1900 || birthDay.after(new Date())){ throw new RuntimeException("身份证生日时间错误"); } String tempBirthDay = sf.format(birthDay); if(!birthDayStr.equals(tempBirthDay)){ throw new RuntimeException("省份证生日时间错误"); } }catch (Exception e){ e.printStackTrace(); } char[] chs = idNum.toCharArray(); int sum = 0; for (int i = 0 ; i < chs.length ; i++){ int j = Integer.parseInt(Character.toString(chs[i])); sum += j * (Math.pow(2,17-i) % 11); } int x = (12 - sum % 11) % 11; return x == 10 ? "X" : x + ""; } public static void main(String[] args) { String idNumStr = "150***************"; assert idNumStr != null; if (idNumStr.length() != 18) { throw new RuntimeException("身份证号位数错误"); } String idNumSubStr = idNumStr.substring(0, idNumStr.length() - 1); Long.parseLong(idNumSubStr); String lastStr = idNumStr.substring(idNumStr.length() - 1).toUpperCase(); System.out.println(lastStr.equals(validationNum(idNumSubStr))); System.out.println(65536%11); } }
相关文章推荐
- 四则运算4最终版
- 计算机操作系统(一)发展与体系结构
- [BZOJ3504][CQOI2014]危桥(最大流)
- Prime Ring Problem
- Prime Ring Problem
- MyBatis学习总结(一)——MyBatis快速入门
- 极光推送(接收后台消息和自定义消息)
- XUtils===XUtils3框架的基本使用方法(一)
- 我把近视从600度直降到0度 作者:灵魂旗舰 谈谈治疗近视的雾视疗法
- win7下使用U盘安装centOS6.3双系统
- 四种常见的 POST 提交数据方式
- Python Twisted系列教程20: Twisted和Erlang
- iOS主要设备支持的视频格式
- Centos 6.7 安张nagios和cacti 并添加监控主机
- Linux关于MySQL数据导出导入
- 股权投资-导出要股权是好事么
- 39、EXT 做布局设置region
- Mac Qt企业版插件安装
- HTTP in iOS你看我就够
- 密码输入框bug,LinearLayout拦截下滑事件