身份证校验码计算
最近看一份文档看到身份证规则,觉得很有趣,这里记录一下如何计算校验码
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