Skip to content

Instantly share code, notes, and snippets.

@Fgaoxing
Created February 11, 2025 16:40
Show Gist options
  • Save Fgaoxing/297aa01d0439bb393b0dc3f79796ee42 to your computer and use it in GitHub Desktop.
Save Fgaoxing/297aa01d0439bb393b0dc3f79796ee42 to your computer and use it in GitHub Desktop.
测试身份证生成工具
def calculate_check_code(id_17):
"""计算身份证校验码"""
factors = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
check_codes = '10X98765432'
total = sum(int(c) * factors[i] for i, c in enumerate(id_17))
return check_codes[total % 11]
def generate_id_numbers(area_code, birth_date, gender):
"""
生成符合校验规则的身份证号
:param area_code: 6位地区代码(字符串)
:param birth_date: 8位出生日期(字符串,格式YYYYMMDD)
:param gender: 性别('男' 或 '女')
:return: 生成器,产生有效身份证号
"""
# 生成顺序码(前两位范围000-999,第三位根据性别确定奇偶)
for seq in range(0, 100):
for gender_code in (1, 3, 5, 7, 9) if gender == '男' else (0, 2, 4, 6, 8):
# 构建前17位
first_17 = f"{area_code}{birth_date}{seq:02d}{gender_code}"
# 计算校验码
check_code = calculate_check_code(first_17)
yield f"{first_17}{check_code}"
def validate_id(id_number):
"""验证身份证号有效性"""
if len(id_number) != 18:
return False
try:
return id_number[-1] == calculate_check_code(id_number[:17])
except:
return False
# 使用示例
if __name__ == '__main__':
# 参数设置
area_code = "220500" # 北京东城区
birth_date = "2010100x" # 1990年2月10日
gender = "男"
# 生成测试用例
test_cases = list(generate_id_numbers(area_code, birth_date, gender))
# 验证并输出前20个结果
print(f"共生成有效身份证号 {len(test_cases)} 个")
print("具体:")
for case in test_cases:
print(f"{case}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment