python 自动批量生成sfz号

本文内的内容均仅限于学习交流,请勿作恶!

首先是一点小科普

sfz号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码八位数字出生日期码三位数字顺序码一位数字校验码

所以只有后四位是不确定的

sfz校验码

sfz号码中的校验码是sfz号码的最后一位,是根据GB 11643-1999中有关公民身份号码的规定,根据精密的计算公式计算出来的,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码,最后一位是数字校验码。

计算方法:

将前面的sfz号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;

sfz第_位 第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

将乘出的结果相加并除11取余,只能得到0-10共11个数字,分别对应的最后一位sfz的号码为1 0 X 9 8 7 6 5 4 3 2

余数 1 2 3 4 5 6 7 8 9 10 0
相对于的结尾 0 x 9 8 7 6 5 4 3 2 1

所以生成后四位和前面固定的十四位组到一起即可

以下直接是成品:

list=[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
list_len=len(list)
last_number_list=['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']

def check():
    known_num=input("已知的sfz号,根据户籍地区查前六位,根据出生年月日确定中间八位:")
    for unknown_num in range(0,1000):#生成倒数第4-2位
        unknown_num_len=len(str(unknown_num))
        if unknown_num_len == 1:#不满足三位时填两个0
            ID_number=known_num+"00"+str(unknown_num)
        elif unknown_num_len == 2:#不满足三位时填一个0
            ID_number=known_num+"0"+str(unknown_num)
        else:
            ID_number=known_num+str(unknown_num)
        sum=0
        digs=ID_number
        for i in range(17):
            multiplier=list[i]
            product = int(digs[i]) * multiplier
            sum=sum+product
            remainder = sum %11
            check_number=last_number_list[remainder]
        print(ID_number+str(check_number))

start=check()

image
本文出自于 https://www.cnblogs.com/tharsis/ 转载请注明出处。

posted @ 2022-07-29 11:54  mutel024  阅读(881)  评论(0编辑  收藏  举报