身份证验证算法
18位身份证号码结构
公民身份证号码是特征组合码,由十七位数字本体码和一位校验码组成。
排列顺序从左至右依次为:6位数字地址码,8位数字出生日期码,3位数字顺序码和1位校验码。
-
地址码:表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。
-
出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
-
顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
-
校验码
校验码计算步骤
- (1) 17位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, … , 16
,先对前17位数字的权求和
Ai: 表示第i位置上的身份证号码数字值(0~9)
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(表示第i位置上的加权因子)
- (2) 计算模
Y = mod(S, 11)
- (3) 根据模,查找得到对应的校验码
模值Y | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
校验码 | 1 | 0 | X | 9 | 8 | 7 | 6 | 7 | 4 | 3 | 2 |
JavaScript校验算法实例
var validateID = function (id) {
id = id.replace(/^\s*|\s*$/g, '')
id = id.replace(/x/g, 'X')
var city = {11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江 ', 31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北 ', 43: '湖南', 44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏 ', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门'}
if (!id || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(id)) {
return false
}
if (!city[id.substring(0, 2)]) {
return false
}
if (id.length === 18) {
var idArr = id.split('')
var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
var parity = [ '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' ]
var sum = 0
for (var i = 0; i < 17; i++) {
sum += idArr[i] * factor[i]
}
if (parity[sum % 11] !== idArr[17]) {
return false
}
}
return true
}
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/id-verification-algorithm/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论