• 中华人民共和国公民身份证验证和计算方式


      我国的公民身份证统一为18为数字,按照地址码+生日+顺序码+校验码组成。

      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);
        }
    }
  • 相关阅读:
    常用软件列表
    Mybatis源码分析
    百度高效研发实战训练营Step4
    百度高效研发实战训练营Step2
    百度高效研发实战训练营Step1
    百度高效研发实战训练营Step3
    【WPF】FontAwesome图标字体下载及在WPF中的使用
    Vision MLP | ActiveMLP: An MLPlike Architecture with Active Token Mixer
    返回与数据列表中不重复的数据
    算法题焦虑的蚂蚁
  • 原文地址:https://www.cnblogs.com/duwenlei/p/5359461.html
Copyright © 2020-2023  润新知