返回

用Python化繁为简,玩转随机身份证生成。

开发工具

身份证号码的组成

中华人民共和国国家标准GB 11643-1999《公民身份号码》中规定:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。

  • 区域码:指的是公民常住户口所在县(市、镇、区)的行政区划代码,如110102是北京市-西城区。但港澳台地区居民的身份号码只精确到省级。
  • 出生日码:指的是公民出生的年月日,如19900101是1990年1月1日。
  • 顺序码:指的是公民在同一地址按出生日期先后顺序排列的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
  • 校验码:校验码是根据前面十七位数字本体码计算出来的,它使身份证号码具有唯一性和不易伪造性。

身份证号码的校验

身份证号码的校验码是根据前面十七位数字本体码计算出来的,校验码的计算方法如下:

  1. 将身份证号码的前十七位数字乘以不同的权重系数,权重系数为7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
  2. 将乘积相加,然后取模11。
  3. 如果余数为0,则校验码为0;如果余数不为0,则校验码为11减去余数。

使用Python生成随机身份证号码

现在,我们来看看如何使用Python生成随机身份证号码。

import random

def generate_random_id_number():
  """生成随机身份证号码。"""

  # 生成区域码
  province_code = random.choice(['11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33', '34', '35', '36', '37', '41', '42', '43', '44', '45', '46', '50', '51', '52', '53', '54', '61', '62', '63', '64', '65', '71', '81', '82'])

  # 生成出生日期码
  year = random.randint(1900, 2099)
  month = random.randint(1, 12)
  day = random.randint(1, 28)
  birth_date = str(year) + str(month).zfill(2) + str(day).zfill(2)

  # 生成顺序码
  sequence_code = random.randint(1000, 9999)

  # 生成校验码
  id_number = province_code + birth_date + str(sequence_code)
  weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
  checksum = 0
  for i in range(17):
    checksum += int(id_number[i]) * weights[i]
  checksum %= 11
  if checksum == 0:
    check_code = '0'
  elif checksum == 1:
    check_code = 'X'
  else:
    check_code = str(11 - checksum)

  # 返回生成的身份证号码
  return id_number + check_code


# 生成10个随机身份证号码
for i in range(10):
  id_number = generate_random_id_number()
  print(id_number)

运行以上代码,即可生成10个随机身份证号码。

总结

这篇文章介绍了如何使用Python随机生成身份证号码,包括校验码的计算和身份证号码的校验。通过使用Python的强大功能,我们可以轻松玩转随机身份证生成。对于程序员来说,这不仅是一个有趣的练习,更是一个实用的工具。