51 lines
1.4 KiB
Markdown
51 lines
1.4 KiB
Markdown
中国身份证号码的校验涉及严格的规则,主要用于验证号码的格式合法性(是否符合国家标准),但无法验证证件真实性(需对接公安系统)。以下是完整的校验规则和实现逻辑:
|
||
|
||
身份证号码结构(18位)
|
||
`AAAAAA YYYYMMDD XXX C`
|
||
|
||
地址码(AAAAAA):前6位,代表户籍所在地(需符合最新行政区划代码)。
|
||
|
||
出生日期码(YYYYMMDD):第7-14位,必须为有效日期(如19900101)。
|
||
|
||
顺序码(XXX):第15-17位,奇数男性、偶数女性。
|
||
|
||
校验码(C):第18位,由前17位计算得出(0-9或X)。
|
||
|
||
校验码计算规则
|
||
权重分配:前17位分别乘以固定权重系数:
|
||
`[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]`
|
||
|
||
加权求和:
|
||
`S = Sum(ID[i] * W[i]) (i=0~16)`
|
||
|
||
取模11:
|
||
S_mod = S % 11
|
||
|
||
映射校验码:根据余数S_mod查表:
|
||
|
||
| 余数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|
||
|------|---|----|----|----|----|----|----|----|----|----|-----|
|
||
| 校验码 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
|
||
|
||
校验步骤(代码实现逻辑)
|
||
基本检查:
|
||
|
||
长度必须为18位
|
||
|
||
前17位全为数字
|
||
|
||
第18位是数字或X
|
||
|
||
地址码校验:
|
||
|
||
前6位在有效行政区划列表中(需定期更新)
|
||
|
||
日期校验:
|
||
|
||
第7-14位转换为日期(如1990-01-01),检查是否为有效日期
|
||
|
||
校验码计算:
|
||
|
||
按权重计算并比对最后一位
|
||
|