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


Posted in Python onDecember 04, 2018

GitHub : https://github.com/jayknoxqu/id-number-util

身份组成方式

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

18位数字组合的方式是:

1 1 0 1 0 2 Y Y Y Y M M D D 8 8 8 X
区域码(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}

所以:

i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1

•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('410326199507103197').area_id # 地址编码:410326
  print IdNumberUtil('410326199507103197').get_area_name() # 地址:汝阳县
  print IdNumberUtil('410326199507103197').get_birthday() # 生日:1995-7-10
  print IdNumberUtil('410326199507103197').get_age() # 年龄:23(岁)
  print IdNumberUtil('410326199507103197').get_sex() # 性别:1(男)
  print IdNumberUtil('410326199507103197').get_check_digit() # 校验码:7
  print IdNumberUtil.verify_id('410326199507103198') # 检验身份证是否正确:False

[√]: 代码地址: https://github.com/jayknoxqu/id-number-util

总结

以上所述是小编给大家介绍的Python随机生成身份证号码及校验功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python中用于检查英文字母大写的isupper()方法
May 19 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
Python设计模式之抽象工厂模式
Aug 25 Python
Python调用微信公众平台接口操作示例
Jul 08 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
Python实现的直接插入排序算法示例
Apr 29 Python
Python中__slots__属性介绍与基本使用方法
Sep 05 Python
python使用turtle库绘制奥运五环
Feb 24 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
python 从文件夹抽取图片另存的方法
Dec 04 #Python
使用Python实现微信提醒备忘录功能
Dec 04 #Python
flask-restful使用总结
Dec 04 #Python
Python读取YUV文件,并显示的方法
Dec 04 #Python
对Python3+gdal 读取tiff格式数据的实例讲解
Dec 04 #Python
用python代码将tiff图片存储到jpg的方法
Dec 04 #Python
浅谈python下tiff图像的读取和保存方法
Dec 04 #Python
You might like
用PHP编程开发“虚拟域名”系统
2006/10/09 PHP
php设计模式 Visitor 访问者模式
2011/06/28 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
js实现在文本框光标处添加字符的方法介绍
2012/11/24 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
一个手写的vue放大镜效果
2019/08/09 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
优秀团支部事迹材料
2014/02/08 职场文书
小学二年级学生评语
2014/04/21 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript