中国身份证 ID 规则检查
在业务流程中,身份证号码的检查,是一个常见的需求。本例探讨了在无外部数据支持下,仅就身份证号码的编码规则和约束,离线进行身份证号码检查的方式和实现。
现在的身份证号码,理论上是出生后,在登记户口时,就由户口登记部门确定了,终身不变;也和户籍无直接的关系。
中国标准身份证号码,由 18 位数字或字母构成,具体如下:
- 6 位: 其实是登记的时候,登记地的行政区划编码,精确到区县;也可以理解为出生地。
- 8 位:出生日期,编码格式位 YYYYMMDD
- 3 位: 登记序号,分奇偶,奇数为男性,偶数女性,如 015,017 等
- 1 位:校验码,只有校验码才有可能是字母 X(其实也是罗马数字 10),又校验规则决定
身份证号码本身能够确定的个人基本信息包括出生地(初次登记地),出生日期(年龄),性别
检查流程
首先检查编码规则,然后是校验码,然后是出生日期,其次是地区码。
长度和编码
中国标准身份证号码只有两个长度 15 和 18。 15 位是老身份证(2000 年以前的),现在可以作为疑问身份证处理。
15 比 18 位身份证缺少的信息是 2 位年份和 1 位校验码。
此外身份证号前 17 位只能由数字构成,后 1 位只能是数字或者 X,
登记地
登记地编码其实基于中国标准行政区划编码,但由于行政区划的发展和变更,并不是当前的编码,这一部分需要人为维护。
现在的方案比较简单,列表仅精确到市州,可以检查大多数有问题的数据。
本案中使用的编码表如下:
IDREGION = { 11: "01", // beijing 12: "01", // tianjin 13: "01,02,03,04,05,06,07,08,09,10,11,28", //hebei 14: "01,02,03,04,05,06,07,08,09,10,11,22,23,24,26,27", //shanxi 15: "01,02,03,04,05,06,07,08,09,21,22,23,25,26,27,28,29", // neimeng 21: "01,02,03,04,05,06,07,08,09,10,11,12,13,14,39", //liaoning 22: "01,02,03,04,05,06,07,08,24", //jilin 23: "01,02,03,04,05,06,07,08,09,10,11,12,23,27,90", // heilongjiang 31: "01", // shanghai 32: "01,02,03,04,05,06,07,08,09,10,11,12,13", // jiangsu 33: "01,02,03,04,05,06,07,08,09,10,11,25,26,90", //zhejiang 34: "01,02,03,04,05,06,07,08,10,11,12,13,14,15,16,17,18,24,25,26,29", // anhui 35: "01,02,03,04,05,06,07,08,09,21,22", // fujian 36: "01,02,03,04,05,06,07,08,09,10,11,21,22,23,24,25", //jiangxi 37: "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,23,29", // shandong 41: "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,27,28,30", // henian 42: "01,02,03,05,06,07,08,09,10,11,12,13,22,23,24,28,90", // hubei 43: "01,02,03,04,05,06,07,08,09,10,11,12,13,25,28,31", // hunan 44: "01,02,03,04,05,06,07,08,09,12,13,14,15,16,17,18,19,20,51,52,53", // guangdong 45: "01,02,03,04,05,06,07,08,09,10,11,12,13,14,21,22,23,24,25,26,27", // guangxi 46: "00,01,02,03,04,90", //hainan 50: "01,02,03,07", //chongqing 51: "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,22,23,25,29,30,31,32,33,34,35,36,37,38,39,90,93", // sichuan 52: "01,02,03,04,05,06,23,24,26,27", // guizhou 53: "01,03,04,05,06,07,08,09,21,22,23,25,26,27,28,29,30,31,32,33,34,35", // yunnan 54: "01,02,03,04,05,06,21,22,23,24,25,26", // xizang 61: "01,02,03,04,05,06,07,08,09,10,23,24,25,26,27,70", // shanxi 62: "01,03,04,05,06,07,08,09,10,11,12,21,22,23,24,25,26,27,28,29,30", //gansu 63: "01,02,21,22,23,25,26,27,28", // qinghai 64: "01,02,03,04,05,22", // ningxia 65: "01,02,04,05,21,23,27,28,29,30,31,32,40,41,42,43,90", // xinjiang //71: "01", 81: "00", 82: "00", 83: "00" // taiwan },
出生日期
检查出生日期是否正确的方式包括
- 此出生日期,是否能够转换为一个正确的时间,如 20041302 显然就不是一个正确的日期
- 出生日期是否合理,如对于中学生而言,出生在未来不可能,或者年龄小于 6 岁或者大于 30 岁都是疑问数据。
校验码
中国身份证号码使用的校验标准和技术是: ISO 7064:1983, MOD 11-2 校验字符系统。
其基本公式为:
J = ∑(a[i]×W[i])%11
,前 17 位每位的整数值和当前位校验因子的成绩,求和后除 11 的余数。余数可能为 10,即 X。将此数和身份证最后一位进行比较,可以检查号码的合规性。
其中 W[i]是当前位的校验因子,可由查表或者公式计算而来。
下面是其 JS 代码实现:
// 校验因子 IDFACT = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 或者计算得到: IDFACT = Array(17).fill().map((v,i)=> (17-i)).map(v=>(2**v)%11); // check code if (idnumber.length == 18) { let ll = 12 - IDFACT.reduce((r,v,i) => { return r+v*idnumber[i] },0) % 11 ; ll = (ll == 10) ? 'X' : ( ll > 10 ) ? (ll % 11) : ll; if (idnumber[17] !== (ll+'')) return "607-校验码错误"; }
之所以要这一设计校验码,除了信息校验的功能之外,其实还有错误纠正的功能,如果其中有一位数据错误,是可以纠正回来的,当通常不这样使用。
错误编码
本案提供的错误编码如下:
500 - 格式错误
601 - 长度或字符串无效
602 - 内容非数字
603 - 省份编码错误
604 - 地区编码错误
605 - 日期或格式错误
606 - 无效或超常日期
607 - 校验码错误
200 - OK
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: FiDO2 认证实现和集成
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论