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中apply函数的用法实例教程
Jul 31 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
python实用代码片段收集贴
Jun 03 Python
在Django中同时使用多个配置文件的方法
Jul 22 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
Django实现文件上传下载功能
Oct 06 Python
python默认参数调用方法解析
Feb 09 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
python实现双链表
May 25 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
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
PHP 实用代码收集
2010/01/22 PHP
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
PHP查询网站的PR值
2013/10/30 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
动态加载iframe
2006/06/16 Javascript
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
深入解析Python中的集合类型操作符
2015/08/19 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
python文件和文件夹复制函数
2020/02/07 Python
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
客户接待方案
2014/02/26 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
土地转让协议书
2014/09/27 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
培训心得体会怎么写
2016/01/25 职场文书