码迷,mamicode.com
首页 > 其他好文 > 详细

身份证号码生成与校验

时间:2017-08-21 15:45:05      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:pre   执行   eof   ==   组合   esc   排列   i++   math   

  在测试过程中难免会遇到需要身份证号码的情况,记录下随机生成身份证号码与如何检验身份证号码的方法。

  首先要了解身份证号码的组成方式: 

  1. 号码结构:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 
  2. 地址码(前六位数):表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 
  3. 出生日期码(第七位至十四位):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 
  4. 顺序码(第十五位至十七位) :表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 
  5. 校验码(第十八位数):校验位

  18位身份证就是如上构成,15位身份证缺少的年份两位数和最后一位校验码。

  要生成身份证号码首先得确定 地址码和出生日期码也可以按照规定随机抽取,顺序码自己使用函数随机生成一个2位数的码值。校验码通过计算得到。

  比如现有山西 阳泉市 市辖区的地址码140301 ,出生日期码19920101和随机生成的888顺序码。其校验码的生成代码如下

  /**
     *  @Title generateId
     *  @Descript :计算身份证的校验位并返回完整的18位身份证
     *  @param:前17位码值
     *  @return 前17位码值+校验位
     *  @throws
     *  @version V1.0
     */
    public String generateId(String param) {
        char[] chars=param.toCharArray();
        int result=0;
        for(int i=0;i<chars.length;i++){
            result+=Integer.parseInt(String.valueOf(chars[i]),10)*(Math.pow(2,chars.length-i)%11);
        }
        result=result%11;
        result=result==0?1:result==1?0:12-result;
        return result==10?param+"X":param+result;
    }

  其中校验码的计算规则如下:假设身份证号码前17位是一个17个长度的数组a[17],i表示第i位,从0开始计数直到16。那么

  a[i]乘以(2的i 次方除以11的余数)在累加计算出来的值result,最后校验位就是12-累加的值除以11的余数。需要注意的是如果校验位计算出来是12那么就要替换成1,如果是11就要替换成0,如果是10就替换成X。

身份证号码生成与校验

标签:pre   执行   eof   ==   组合   esc   排列   i++   math   

原文地址:http://www.cnblogs.com/many-object/p/7404526.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!