身份证号码生成与校验

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

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

  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。

时间: 2024-10-14 06:28:21

身份证号码生成与校验的相关文章

身份证号码的合法性校验

javascript版本的身份证号码的合法性校验 版权声明:本文为博主原创文章,未经博主允许不得转载.

身份证号生成,校验码计算

二代身份证号有18位,组成是: 6位地区码+8位出生年月日+3位顺序码+1位校验码 其中,校验码计算如下图,本范例按照红色计算方向走 第一步骤就是映射权重:第二步骤是求积:第三步骤相加求余:最后一个步骤就是查找码表得出最后1位字符 红色方向数字更小,计算更快. import randomimport time   # 地区区域码,此范例只列出3位areas = ('610622', '410901', '321281', '350581')# 身份证前17位权重w17 = (7, 9, 10,

javascript身份证号码验证

https://github.com/oxcow/id-number-validator 版权声明: 关于<javascript身份证号码验证>的一切权利归作者@Leeyee所有: 非商用.非衍生; 如需转载需要注明来源于http://iyiguo.net/blog/2013/07/31/javascript-idcard-validate/ 15位身份证号码编码规则 18位身份证号码编码规则 校验规则 javascript编码实现 源代码 验证示例 15位身份证号码编码规则 ddddddyy

随机生成身份证号码

//程序入口 public static void main ( String[] args ) { Test t = new Test(); for (int i = 0; i < 100; i++)//随机生成100个身份证号码 { System.out.println(t.getRandomID(); } } /** * 获取随机生成的身份证号码 * * @author mingzijian * @return */ public String getRandomID() { String

Java 批量随机生成身份证号码

package org.service.task.fees; import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * * 身份证算法实现 * * 1.号码的结构 公民身份号码是特征组合码, 由十七位数字本体码和一位校验码组成. 排列顺序从左至右依次为:六位数字地址码,八位数字出生日

校验某人的身份证号码

#生成某年的所有日期 def dateRange(year): fmt = '%Y-%m-%d' bgn = int(time.mktime(time.strptime(year+'-01-01',fmt))) end = int(time.mktime(time.strptime(year+'-12-31',fmt))) list_date = [time.strftime(fmt,time.localtime(i)) for i in range(bgn,end+1,3600*24)] re

黄聪:jquery 校验中国身份证号码

大陆18位身份证(第二代身份证) 身份号码是一组具有特征组合码,由十七位数字本体码和一位校验码组成. 排列顺序从左至右依次为:六位数字地区码,八位数字生日码,三位数字顺序码和一位数字校验码. 校验方法: (1)先对前17位数字的权求和 S = Sum(Ci * Vi), i = 0, ... , 16 Ci:表示身份证号码上第i位置的数字值 Vi:表示第i位置上的“加权因子”        加权因子Vi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (2)计算模(固定

Java实现身份证号码校验

二话不说,直接上代码. /** * 校验18位身份证号 * * @param identityCode * * 返回true则表示校验通过 */ public boolean checkIdentityCode(String identityCode) { // 校验身份证位数为18位 if (!identityCode.matches("\\d{17}(\\d|x|X)$")) { return false; } Date d = new Date(); DateFormat df

JS校验身份证号码

var vcity = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽",