比如北京的地址码是110000,表示编码对象常住户口所在县(市、旗、区)的行政区划代码
比如20001001, 编码对象出生的年、月、日,年、月、日代码之间不用分隔符,格式为YYYYMMDD
比如301, 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
根据本体码,通过采用ISO 7064:1983,MOD 11-2校验码系统计算出校验码。本体码是前17位,除校验码外的所有数字。
校验码检验算法
身份证校验码(最后一位)是根据ISO 7064:1983.MOD 11-2标准计算得出的,用于验证身份证号码前17位的正确性。
「算法步骤」
「1. 权重系数」
前17位分别乘以不同的权重系数:
位置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
系数: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
「2. 计算加权和」
将身份证前17位数字分别乘以对应的权重系数,然后求和:
S = ∑(第i位数字 × 权重系数_i)
「3. 计算模值」
计算加权和除以11的余数:
Y = S mod 11
「4. 映射校验码」
根据余数Y,查表得到校验码:
「注意」:X是罗马数字10,代表校验码为10的情况。
代码实现
idcard_str = "11010519491231002X"
idcard_list = [int(char) for char in idcard_str if char.isdigit()]
# 权重列表
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
# 校验码映射
check_codes = ['1', '0',
'X', '9', '8', '7', '6', '5', '4', '3', '2']
# 计算加权和
total = 0
for x,y in zip(idcard_list, weights):
total += x * y
# 计算模值
remainder = total % 11
# 从映射表中取出校验码
expected_check_code = check_codes[remainder]
print(expected_check_code)
使用第三方库
第三库id_validator是一个关于身份证验证、获取信息、模拟生成的库
pip install id_validator
使用起来非常简单
# 验证身份证格式是否正确
idcard_str = "11010519491231002X"
validator.is_valid(idcard_str)
读取身份证信息
from id_validator import validator
idcard_str = "11010519491231002X"
info = validator.get_info(idcard_str)
print.pprint(info)
# 输出结果
# {'abandoned': 0,
# 'address': '北京市市辖区朝阳区',
# 'address_code': '110105',
# 'address_tree': ['北京市', '市辖区', '朝阳区'],
# 'age': 77,
# 'birthday_code': '1949-12-31',
# 'check_bit': 'X',
# 'chinese_zodiac': '丑牛',
# 'constellation': '摩羯座',
# 'length': 18,
# 'sex': 0}
包含地址、地址码、年龄、出生日期码、校验码、生肖、星座、长度、性别等信息。
模拟生成身份证
# validator.fake_id(是否18位, 出生地, 出生日期, 性别)
new_card = validator.fake_id(True, '西城区',
'19901122', 1)
print(new_card)
# 输出: 110102199011226190
界面开发
通过上面的id_validator,借助AI大模型生成一个身份证信息获取及随机生成的界面程序
身份证信息读取