根据国家标准GB 11643-1999《公民身份证号码》的要求:
身份证号码由18位组成,前17位为数字,最后一位是校验码,可能为数字或字母X。其中,前6位是地区代码,接下来8位是出生日期,最后3位是顺序号。
具体算法如下:
- 将身份证号码的前17位数字分别乘以不同的系数,系数如下:
7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 - 将上步得到的结果相加,得到和值。
- 将和值对11取模,得到模值。
- 根据模值得到对应的校验码,对应关系如下:
0 1 2 3 4 5 6 7 8 9 10
1 0 X 9 8 7 6 5 4 3 2
因此,身份证校验的Python代码如下:
def check_id(id: str) -> bool:
if len(id) != 18:
return False
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
factors = [int(id[i]) * weights[i] for i in range(17)]
checksum = sum(factors) % 11
if id[17] == 'X':
return checksum == 2
return int(id[17]) == checksum
# 例子
print(check_id('110101199003074374')) # True
print(check_id('110101199003074373')) # False