身份证校验码计算

最近看一份文档看到身份证规则,觉得很有趣,这里记录一下如何计算校验码

1 身份证编码规则

《中华人民共和国国家标准GB 11643-1999》中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:

  • 六位数字地址码 (编码对象常住户口所在县(市、旗、区)的行政区划代码,按 GB/T 2260的规定执行),
  • 八位数字出生日期码(表示编码对象出生的年、月、日,按GB/T 7408的规定执行。年、月、日代码之间不用分隔符)
  • 顺序码 (表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数 分配给男性 ,偶数分配给女性。)。
  • 一位数字校验码( 校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码)

简单举例:
在这里插入图片描述

现在去翻了国标文档: GB/T 2260
翻到四川省广元市市中区 的地区码为510802
我们就可以人为制造一个身份证号码: 51080219900603052_ 这个身份证号码
表示 四川省广元市市中区 1990年6月3日出生的 第26位女生 。

问题来了 那么上诉人为编造的 身份证号码最后一位校验码是多少了呢? 这里得去翻国标 GB 11643-1999

2 校验码计算

2.1 校验码计算公式在这里插入图片描述

校验码计算公式:
在这里插入图片描述

2.2 计算思路及代码

现在把上诉校验码计算公式翻译为JS的代码,
1 首先将身份证前17位进行加权求和。加权值位表一中的值
2 对加权求和结果对11取余数
3 对余数数值按照表2进行映射。

得到以下代码

function getCheckCode(originalIDArray){
  const WeightedValue = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
  const CheckCodeMap = new Map([[0, '1'], [1, '0'], [2, 'X'], [3, '9'], [4, '8'], [5, '7'], [6, '6'], [7, '5'], [8, '4'], [9, '3'], [10, '2']]);
  let sum = 0;
  for (let i = 0; i<WeightedValue.length; i++ ) {
    sum += originalIDArray[i] * WeightedValue[i];
  }
  
  return CheckCodeMap.get(sum % 11);
}

const originalID = '51080219900603052';
const originalIDArray = originalID.split('');
const checkCode = getCheckCode(originalIDArray)
const ID = originalID + checkCode;

console.log(ID); // 510802199006030524

算出来最后一位身份证校验码号码为4

3 标准文档

链接: https://pan.baidu.com/s/1k52d6vuMj6ueJdP3VjnhOQ 提取码: ip7i

Logo

欢迎大家加入成都城市开发者社区,“和我在成都的街头走一走”,让我们一起携手,汇聚IT技术潮流,共建社区文明生态!

更多推荐