二代身份证号码效验

发布于 2019-12-13


二代身份证号码效验

1.Maven安装

<dependency>
	<groupId>com.apa70</groupId>
	<artifactId>idvalidation</artifactId>
	<version>1.1.0</version>
</dependency>

2.简单的使用


import com.apa70.idvalidation.IDValidation;
import com.apa70.idvalidation.enums.ErrorCode;
import com.apa70.idvalidation.enums.Sex;

import java.io.IOException;
import java.text.SimpleDateFormat;

public class Test {
    
    public static void main(String[] strings) throws IOException {
        IDValidation idValidation=new IDValidation();
        boolean isSuccess=idValidation.validate("验证的二代身份证号码");
        System.out.println("是否验证成功:"+idValidation.isSuccess());
        if(isSuccess){
            System.out.println("省份:"+idValidation.getProvince());
            System.out.println("城市:"+idValidation.getCity());
            System.out.println("区县:"+idValidation.getCounty());
            System.out.println("省份代码:"+idValidation.getProvinceCode());
            System.out.println("城市代码:"+idValidation.getCityCode());
            System.out.println("区县代码:"+idValidation.getCountyCode());
            System.out.println("性别:"+((idValidation.getSex()== Sex.MAN)?"男":"女"));
            //或者
            //System.out.println("性别:"+idValidation.getSexMsg());
            System.out.println("出生日期:"+new SimpleDateFormat("yyyy-MM-dd" ).format(idValidation.getBirth()));
            System.out.println("使用地区代码的版本:"+idValidation.getRegionVersion());
        }else{
            ErrorCode errorCode=idValidation.getErrorCode();
            switch(errorCode){
                case LENGTH:
                    System.out.println("身份证号长度不正确");
                    break;
                case FORMAT:
                    System.out.println("身份证号格式不正确");
                    break;
                case VERIFY:
                    System.out.println("身份证号效验失败");
                    break;
                case REGION:
                    System.out.println("身份证前六位没有找到相应的省市区");
                    break;
            }

            //或者
            System.out.println(idValidation.getErrorMsg());
        }
    }
}

3.效验原理

效验原理如下:

  1. 判断身份证号码是否足够18位

    二代身份证号码为固定的18位

  2. 判断身份证号码前17位是否为数字

    二代身份证号码第18位有可能为X而前17位为固定的数字

  3. 效验第18位号码

    二代身份证号码前17位通过一个特定的算法可算出第18位具体如下

    1. 前17位与固定的数字相乘后相加具体数字为:第一位×7+第二位×9+第三位×10+第四位5+第五位×8+第六位×4+第七位×2+第八位×1+第九位×6+第十位×3+第十一位×7+第二十位×9+第十三位×10+第十四位×5+第十五位×8+第十六位×4+第十七位×2
    2. 通过上面的公式相加等到的数字在除以11其余数必定为0-10。
    • 如果余数为0则第十八位为1
    • 如果余数为1则第十八位为0
    • 如果余数为2则第十八位为X
    • 如果余数为3则第十八位为9
    • 如果余数为4则第十八位为8
    • 如果余数为5则第十八位为7
    • 如果余数为6则第十八位为6
    • 如果余数为7则第十八位为5
    • 如果余数为8则第十八位为4
    • 如果余数为9则第十八位为3
    • 如果余数为10则第十八位为2
  4. 地区代码效验

    身份证号码的前6位代表户籍所在地精准到区/县,一般来说只要把这些信息保存到本地就好。但是!地区代码并不是一直不会变!比如2019年莱芜市撤市,1997年重庆变为直辖
    这些对应的行政代码都会改变!

    我收集了1980到现在(2020年03月)的地区代码,效验方式为通过出生日期找到其相应年份的代码并寻找,如果找不到则会找到最近一年的版本使用(比如一个人1978年出生,1980,1981,1982都没有数据直到1983才有数据,则会采用1983年的数据)

4.如何扩展地区代码

具体如下

	
import com.apa70.idvalidation.CollectTest;

import java.io.File;
import java.io.IOException;

public class Test {
    
    public void test() throws IOException {
        Collect collect =new Collect();

        File file=new File("html路径所在地");
        //第二个参数为版本号具体为 年+月,如果没有月份直接 年+01。第二个参数也可以传html字符串代码
        collect.add(file,201901,"保存路径");
    }
}

数据通过国家民政部网站获取

使用:


import com.apa70.idvalidation.IDValidation;
import com.apa70.idvalidation.enums.ErrorCode;
import com.apa70.idvalidation.enums.Sex;

import java.io.IOException;
import java.text.SimpleDateFormat;

public class Test {

    public static void main(String[] strings) throws IOException {
        IDValidation idValidation=new IDValidation("扩展的路径");
        boolean isSuccess=idValidation.validate("验证的二代身份证号码");
        System.out.println("是否验证成功:"+isSuccess);
    }
}
  • 注意:扩展路径为 administrative-code-data目录的同级路径
  • 加入扩展路径后,会优先使用扩展路径的数据

5.具体API

IDValidation类:

方法名 参数 返回值 说明
构造方法 - - 无参数构造方法
构造方法 path(String类型,扩展路径) - string类型的构造方法
validate id(String类型,身份证号码) boolean类型,是否效验成功 效验身份证号码的方法
getPath - String类型,扩展路径 获取扩展路径
setPath path(String类型,扩展路径) - 定义扩展路径
isSuccess - boolean类型,是否成功 效验的身份证号码是否成功
getErrorCode - com.apa70.idvalidation.enums.ErrorCode枚举类型,错误代码 ErrorCode.SUCCESS为成功
ErrorCode.LENGTH为长度不正确
ErrorCode.FORMAT为身份证号格式不正确
ErrorCode.VERIFY为身份证号效验失败
ErrorCode.REGION为身份证前六位没有找到相应的省市区
getErrorMsg - String类型,错误信息的汉字描述 获取错误信息的汉字描述
getBirth - java.util.Date类型,出生日期 出生日期具体为 Y-m-d
getSex - com.apa70.idvalidation.enums.Sex枚举类型,性别 Sex.MAN为男,Sex.WOMAN为女
getSexMsg - String类型,性别的汉字描述 固定为男或者女
getProvince - String类型,身份证号所在省 -
getCity - String类型,身份证号所在市 -
getCounty - String类型,身份证号所在区/县 -
getProvinceCode - int类型,身份证号所在省代码 -
getCityCode - int类型,身份证号所在市代码 -
getCountyCode - int类型,身份证号所在区/县代码 -
getRegionVersion - int类型,使用的地区代码版本 如:201901

Collect类:

方法名 参数 返回值 说明
add file(File类型,html文件的file对象)
version(int类型,版本号如201901)
path(String类型,保存路径)
- -
add htmlString(String类型,html字符串代码)
version(int类型,版本号如201901)
path(String类型,保存路径)
- -

6.源码地址

7.数据地址

中华人民共和国民政部