Alex.Merceryj 发表于 2023-5-29 09:07

Python3身份证校验

# python3身份证校验
* 看到有朋友发了一个专门的身份证校验,就很感兴趣,好奇是什么原理。百度了下计算规则,发现python也可以实现。
* [来源地址](https://www.52pojie.cn/thread-1790813-1-1.html)
* [在线身份证校验](http://www.ip33.com/shenfenzheng.html)

## py3实现
* 实际上就是根据身份证前17位,计算求和,然后取余找到对应的校验码。

```python
# 身份证计算规则
# 身份证号码 最后一位随便填
s_id="530102199112214016"
# 系数
c_list=
# 余数对应列表
s_c_list=["1","0","X","9","8","7","6","5","4","3","2"]

#s求和
s_sum=0
for index,i in enumerate(s_id):
    s_sum=s_sum+int(i)*c_list
    # print(s_sum)
# 求余数
c_mod=s_sum%11
result=s_id+str(s_c_list)
# 合法身份证
print(result)
```

daimiaopeng 发表于 2023-5-29 11:45

def check_id_card(id_card):
    """
    身份证校验函数
    :param id_card: 身份证号码
    :return: True or False
    """
    # 身份证号码长度必须为18位
    if len(id_card) != 18:
      return False

    # 身份证号码的前17位必须为数字
    if not id_card[:17].isdigit():
      return False

    # 身份证号码的最后一位可以是数字或字母X(大小写均可)
    if not (id_card[-1].isdigit() or id_card[-1].lower() == 'x'):
      return False

    # 身份证号码校验规则
    weights =
    check_codes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    id_card_sum = 0
    for i in range(17):
      id_card_sum += int(id_card) * weights

    check_code = check_codes
    if check_code != id_card[-1].upper():
      return False

    return True

oneai 发表于 2023-5-29 15:15

zhy1992 发表于 2023-5-29 10:18

这个好像就是检验最后一个校验位合不合规把并不涉及到是不是真实存在 好像

yaphoo 发表于 2023-5-29 10:20

真的太神奇了

zhangxuou123 发表于 2023-5-29 10:54

这技术有点高

wuxin9749 发表于 2023-5-29 11:05

zhy1992 发表于 2023-5-29 10:18
这个好像就是检验最后一个校验位合不合规把并不涉及到是不是真实存在 好像

对 只是通过算法去校验最后一个校验位并不能说明真实存在

prempeng 发表于 2023-5-29 11:07

bake 发表于 2023-5-29 11:23

有更精简的代码https://www.52pojie.cn/thread-1707359-1-1.html

PleasantXuan 发表于 2023-5-29 12:00

这个只是核验校验位,感觉只能防止手滑输错吧

laustar 发表于 2023-5-29 13:27

学习了!!!
页: [1] 2
查看完整版本: Python3身份证校验