身份证校验码计算

身份证校验码计算

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值