身份证验证算法

18位身份证号码结构

公民身份证号码是特征组合码,由十七位数字本体码和一位校验码组成。

排列顺序从左至右依次为:6位数字地址码,8位数字出生日期码,3位数字顺序码和1位校验码。

  1. 地址码:表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。

  2. 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

  3. 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

  4. 校验码

校验码计算步骤

  • (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校验算法实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :