身份证号码生成与校验
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身份证号码生成与校验相关的知识,希望对你有一定的参考价值。
在测试过程中难免会遇到需要身份证号码的情况,记录下随机生成身份证号码与如何检验身份证号码的方法。
首先要了解身份证号码的组成方式:
- 号码结构:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
- 地址码(前六位数):表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
- 出生日期码(第七位至十四位):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
- 顺序码(第十五位至十七位) :表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
- 校验码(第十八位数):校验位
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。
以上是关于身份证号码生成与校验的主要内容,如果未能解决你的问题,请参考以下文章