中国身份证 ID 规则检查

发布于 2024-09-11 18:08:21 字数 4011 浏览 37 评论 0

在业务流程中,身份证号码的检查,是一个常见的需求。本例探讨了在无外部数据支持下,仅就身份证号码的编码规则和约束,离线进行身份证号码检查的方式和实现。
现在的身份证号码,理论上是出生后,在登记户口时,就由户口登记部门确定了,终身不变;也和户籍无直接的关系。

中国标准身份证号码,由 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

卖梦商人

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文