美文网首页
java 二代身份证号码效验

java 二代身份证号码效验

作者: Apa琦 | 来源:发表于2019-12-11 11:20 被阅读0次

    二代身份证号码效验

    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("验证的二代身份证号码");
            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.源码地址

    7.数据地址

    中华人民共和国民政部

    相关文章

      网友评论

          本文标题:java 二代身份证号码效验

          本文链接:https://www.haomeiwen.com/subject/yedogctx.html