问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

身份证号码校验算法详解

创作时间:
作者:
@小白创作中心

身份证号码校验算法详解

引用
搜狐
1.
https://m.sohu.com/a/861969418_122078233?scm=10008.1479_13-1479_13-68_68.0-3449004.0.0

中国大陆第二代身份证号码由18位数字或字母组成,其中每一位都有其特定的含义。本文将详细介绍身份证号码的结构及其校验算法,并提供Python代码实现,帮助读者更好地理解和应用这一算法。

身份证号码的结构

中国大陆第二代身份证号码由18位数据或字母组成,每位数据都有特定的含义,结果如下:

每组数字都有不同的含义:

  1. 第1至2位数字代表所在省(直辖市、自治区)的代码;
  2. 第3至4位数字代表所在地级市(自治州)的代码;
  3. 第5至6位数字代表所在区(县、自治县、县级市)的代码;
  4. 第7-14位数字代表出生年、月、日;
  5. 第15-16位数字代表所在的派出所代码;
  6. 第17位数字表示性别,奇数表示男性,偶数表示女性;
  7. 第18位是校验码,用于验证身份证号码的正确性。

身份证号码的校验算法

身份证号码的校验算法主要通过计算加权和、求余数、查找校验码等步骤来完成。具体步骤如下:

  1. 将身份证号码的前17位数字分别乘以对应的权重(从左到右依次为7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2)。
  2. 将上一步得到的结果相加,得到加权和。
  3. 将加权和除以11,得到余数。
  4. 根据余数查找对应的校验码。余数与校验码的对应关系如下:
余数
0
1
2
3
4
5
6
7
8
9
10
校验码
1
0
X
9
8
7
6
5
4
3
2

例如,对于身份证号码32050219801231001X,其前17位数字为32050219801231001,对应的权重为7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。计算加权和为:

37 + 29 + 010 + 55 + 08 + 24 + 12 + 91 + 86 + 03 + 17 + 29 + 310 + 15 + 08 + 04 + 1*2 = 180

将180除以11,得到余数为1,对应的校验码为0,与身份证号码中的校验码X不匹配,说明这个身份证号码是错误的。

Python代码实现

以下是身份证号码校验算法的Python代码实现:

def validate_id_card(id_card):
    # 定义权重和校验码映射
    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']

    # 计算加权和
    weighted_sum = sum(int(id_card[i]) * weights[i] for i in range(17))

    # 计算余数
    remainder = weighted_sum % 11

    # 获取校验码
    check_code = check_codes[remainder]

    # 检查校验码是否匹配
    return check_code == id_card[17]

# 测试身份证号码
id_card = '32050219801231001X'
print(validate_id_card(id_card))

这段代码定义了一个validate_id_card函数,用于验证身份证号码的正确性。函数首先定义了权重和校验码映射,然后计算加权和和余数,最后获取校验码并检查是否与身份证号码中的校验码匹配。测试身份证号码32050219801231001X的结果为False,说明这个身份证号码是错误的。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号