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+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
wxpython实现图书管理系统
Mar 12 Python
Python比较2个时间大小的实现方法
Apr 10 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
Python面向对象之类和对象实例详解
Dec 10 Python
Django 迁移、操作数据库的方法
Aug 02 Python
Python 用matplotlib画以时间日期为x轴的图像
Aug 06 Python
python matplotlib拟合直线的实现
Nov 19 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
python实现猜数游戏
Mar 27 Python
浅析Python 字符编码与文件处理
Sep 24 Python
python 实现IP子网计算
Feb 18 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(5) 类和对象
2010/02/16 PHP
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
Element InputNumber计数器的使用方法
2020/07/27 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
python获取本机所有IP地址的方法
2018/12/26 Python
分析经典Python开发工程师面试题
2019/04/08 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
实习生求职自荐信
2014/02/07 职场文书
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
环保建议书200字
2014/05/14 职场文书
新郎接新娘保证书
2015/05/08 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
关于保护环境的建议书
2019/06/24 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL