Python随机生成身份证号码及校验功能

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python随机⽣成⾝份证号码及校验功能
⾝份组成⽅式
中华⼈民共和国国家标准GB 11643-1999《公民⾝份号码》中规定:公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位校验码组成。

18位数字组合的⽅式是:
1 1 0 1 0 2Y Y Y Y M M D D8 88X
区域码(6位)出⽣⽇期码(8位)顺序码(2位)性别码(1位)校验码(1位)
区域码(6位) 出⽣⽇期码(8位) 顺序码(2位) 性别码(1位) 校验码(1位)
•区域码指的是公民常住户⼝所在县(市、镇、区)的⾏政区划代码,如110102是北京市-西城区。

但港澳台地区居民的⾝份号码只精确到省级。

•出⽣⽇期码表⽰公民出⽣的公历年(4位)、⽉(2位)、⽇(2位)。

•顺序码表⽰在同⼀区域码所标识的区域范围内,对同年、同⽉、同⽇出⽣的⼈编定的顺序号。

•性别码奇数表⽰男性,偶数表⽰⼥性。

•最后⼀位是校验码,这⾥采⽤的是ISO 7064:1983,MOD 11-2校验码系统。

校验码为⼀位数,但如果最后采⽤校验码系统计算的校验码是“10”,碍于⾝份证号码为18位的规定,则以“X”代替校验码“10”。

校验码计算⽅法
•1. 将⾝份证号码从右⾄左标记为a_1 , a_2 , \cdots , a_{18},a_1即为校验码;
•2. 计算权重系数 W_i=2^{i-1}\ \bmod \ {11}
所以:
i181716151413121110987654321
Wi79105842163791058421
•3. 计算S = \sum_{i=2}^{18} a_i \cdot W_i
•4. a_1=(12-( S \ \bmod 11)) \bmod 11
使⽤Python获取⾝份证校验码:
def get_check_digit(id_number):
"""通过⾝份证号获取校验码"""
check_sum = 0
for i in range(0, 17):
check_sum += ((1 << (17 - i)) % 11) * int(id_number[i])
check_digit = (12 - (check_sum % 11)) % 11
return check_digit if check_digit < 10 else 'X'
随机⽣成⾝份证
由上⾯的组合⽅式我们可以得出以下代码:
@classmethod
def generate_id(cls, sex=0):
"""
随机⽣成⾝份证号,sex = 0表⽰⼥性,sex = 1表⽰男性
"""
# 随机⽣成⼀个区域码(6位数)
area_info = random.randint(0, len(addr))
id_number = str(addr[area_info][0])
# 限定出⽣⽇期范围(8位数)
start, end = "1960-01-01", "2000-12-30"
days = (datetime.datetime.strptime(end, "%Y-%m-%d") - datetime.datetime.strptime(start, "%Y-%m-%d")).days + 1
birth_days = datetime.datetime.strftime(
datetime.datetime.strptime(start, "%Y-%m-%d") + datetime.timedelta(random.randint(0, days)), "%Y%m%d"
)
id_number += str(birth_days)
# 顺序码(2位数)
id_number += str(random.randint(10, 99))
# 性别码(1位数)
id_number += str(random.randrange(sex, 10, step=2))
# 校验码(1位数)
return id_number + str(cls(id_number).get_check_digit())
⼯具类主要功能
if __name__ == '__main__':
random_sex = random.randint(0, 1) # 随机⽣成男(1)或⼥(0)
print IdNumberUtil.generate_id(random_sex) # 随机⽣成⾝份证号
print IdNumberUtil('410326************').area_id # 地址编码:410326
print IdNumberUtil('410326************').get_area_name() # 地址:汝阳县
print IdNumberUtil('410326************').get_birthday() # ⽣⽇:1995-7-10
print IdNumberUtil('410326************').get_age() # 年龄:23(岁)
print IdNumberUtil('410326************').get_sex() # 性别:1(男)
print IdNumberUtil('410326************').get_check_digit() # 校验码:7
print IdNumberUtil.verify_id('410326************') # 检验⾝份证是否正确:False
总结
以上所述是⼩编给⼤家介绍的Python随机⽣成⾝份证号码及校验功能,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

在此也⾮常感谢⼤家对⽹站的⽀持!。

相关文档
最新文档