# 二代身份证号码效验
**Repository Path**: rocarl/idvalidation
## Basic Information
- **Project Name**: 二代身份证号码效验
- **Description**: 二代身份证效验
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 5
- **Created**: 2020-05-11
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 二代身份证号码效验
## 1.Maven安装
```
com.apa70
idvalidation
1.0.0
```
## 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到现在(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("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.源码地址
+ github:[https://github.com/name-cq/idvalidation](https://github.com/name-cq/idvalidation)
+ 码云(gitee):[https://github.com/name-cq/idvalidation](https://gitee.com/cq-vip/idvalidation)
## 7.数据地址
[中华人民共和国民政部](http://www.mca.gov.cn "中华人民共和国民政部")