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函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
深入理解Python3 内置函数大全
Nov 23 Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
python 分离文件名和路径以及分离文件名和后缀的方法
Oct 21 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
如何获取numpy array前N个最大值
May 14 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获取远程图片并把它保存到本地的代码
2008/04/07 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
sqlalchemy对象转dict的示例
2014/04/22 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
优秀教师事迹材料
2014/12/15 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python