二代身份证号码效验

发布于 2020-02-09


1.Maven安装

<dependency>
	<groupId>com.apa70</groupId>
	<artifactId>idvalidation</artifactId>
	<version>1.0.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(&quot;验证的二代身份证号码&quot;);
    System.out.println(&quot;是否验证成功:&quot;+idValidation.isSuccess());
    if(isSuccess){
        System.out.println(&quot;省份:&quot;+idValidation.getProvince());
        System.out.println(&quot;城市:&quot;+idValidation.getCity());
        System.out.println(&quot;区县:&quot;+idValidation.getCounty());
        System.out.println(&quot;省份代码:&quot;+idValidation.getProvinceCode());
        System.out.println(&quot;城市代码:&quot;+idValidation.getCityCode());
        System.out.println(&quot;区县代码:&quot;+idValidation.getCountyCode());
        System.out.println(&quot;性别:&quot;+((idValidation.getSex()== Sex.MAN)?&quot;男&quot;:&quot;女&quot;));
        //或者
        //System.out.println(&quot;性别:&quot;+idValidation.getSexMsg());
        System.out.println(&quot;出生日期:&quot;+new SimpleDateFormat(&quot;yyyy-MM-dd&quot; ).format(idValidation.getBirth()));
        System.out.println(&quot;使用地区代码的版本:&quot;+idValidation.getRegionVersion());
    }else{
        ErrorCode errorCode=idValidation.getErrorCode();
        switch(errorCode){
            case LENGTH:
                System.out.println(&quot;身份证号长度不正确&quot;);
                break;
            case FORMAT:
                System.out.println(&quot;身份证号格式不正确&quot;);
                break;
            case VERIFY:
                System.out.println(&quot;身份证号效验失败&quot;);
                break;
            case REGION:
                System.out.println(&quot;身份证前六位没有找到相应的省市区&quot;);
                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到现在(2019年10月)的地区代码,效验方式为通过出生日期找到其相应年份的代码并寻找,如果往后翻3年,如果在找不到再往前翻3年,在找不到的话就判断为无效(比如
    一个人为2000年出生那么会找到2000年的地区代码寻找如果找不到会在到 1999年、1998年、1997年、2001年、2002年、2003年的代码再去寻找,在找不到则判断为无效)

4.如何扩展地区代码

具体如下

	
import com.apa70.idvalidation.Collect;

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

public class Test {

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

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

}

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

使用:


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(&quot;扩展的路径&quot;);
    boolean isSuccess=idValidation.validate(&quot;验证的二代身份证号码&quot;);
    System.out.println(&quot;是否验证成功:&quot;+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.数据地址

中华人民共和国民政部