身份证号码自动生成程序(Python)
今天收到一个小需求:需要一个自动生成身份证号码的小程序。近期用python较多,因此打算用python实现。
需求细化:
1.身份证必须能够通过身份证校验程序。
2.通过查询,发现身份证号码是有国家标准的,标准号为 GB 11643-1999 可以从百度下载到这个文档http://zhidao.baidu.com/share/b838c7683bb70af8166efd810a398fec.html
现行身份证号为18位,分别为6位地址码,8位生日,3位顺序码,一位校验码。具体例子可见下图。

前六位也是国家标准,GB2260-2007。吐槽一下,国标竟然没有一个网站供全面检索和免费下载。。。还好国家统计局有这些公开数据。可以从统计数据-》统计标准-》行政区划代码页面内找到最新数据:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html (这个网页上的数据可能会边旧)
出生年月日是8位
顺序码是3位,男生末尾为基数,女生末尾为偶数。
最后一位是校验码。校验算法其实后面有很多数学道理,这里给出最简单的公式:
前17位数字每一位有一个权重值
将第i位上的权重值记作Wi,Wi的值为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
将身份证第i位的数字记作Ai
则使用下列公式算出一个数
S= Sum(Ai*Wi) mod 11 ------------- Sum(Ai*Wi) 取11的模。
这样S的取值如下表:
对每一个S做一个映射 Y,这样就有如下的表
S:0 1 2 3 4 5 6 7 8 9 10
Y:1 0 X 9 8 7 6 5 4 3 2
Y就是最终的校验码。
原型实现过程:
1.获取区域规划码的list,并读入一个dictionary的list中。dictionary结构如下:
{"state":河北省,"city":沧州市,"district":运河区,"code":130903}
丑陋的原型如下:
def getdistrictcode():
with open('districtcode') as file:
data = file.read()
districtlist = data.split('\n')
global codelist
codelist = []
for node in districtlist:
#print node
if node[10:11] != ' ':
state = node[10:].strip()
if node[10:11]==' 'and node[12:13]!=' ':
city = node[12:].strip()
if node[10:11] == ' 'and node[12:13]==' ':
district = node[14:].strip()
code = node[0:6]
codelist.append({"state":state,"city":city,"district":district,"code":code})
上部你得到了一个codelist,里边有所有的区号了。
下面是生成身份证号的原型,基本上是随机生成
def gennerator():
id = codelist[random.randint(0,len(codelist))]['code'] #地区项
id = id + str(random.randint(1930,2013)) #年份项
da = date.today()+timedelta(days=random.randint(1,366)) #月份和日期项
id = id + da.strftime('%m%d')
id = id+ str(random.randint(100,300))#,顺序号简单处理
i = 0
count = 0
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] #权重项
checkcode ={'} #校验码映射
for i in range(0,len(id)):
count = count +int(id[i])*weight[i]
id = id + checkcode[str(count%11)] #算出校验码
return id
原型用到了python的两个标准库
from datetime import date from datetime import timedelta
这样就能初步满足需要了,后续可以根据要就对工具进行细化。
btw,其实,正在开发一个测试数据生成的工具集,近期争取开源。有任何具体需求可以提给我。有想一起做的同学也大大的欢迎:)
身份证号码自动生成程序(Python)的更多相关文章
- 输入身份证号码自动读取生日与性别(delphi)
一.格式介绍: [15位号码格式] 1.第l一6位数为行政区划代码; 2.第7-12位数为出生日期代码; 3.第13---15位数为分配顺序代码; (1).行政区划代码,是指公民第一次申领居民身份证时 ...
- 根据用户输入的二代身份证号码自动为其计算生成出生日期的javascript方法
if(idTypeIsChecked.checked == true){//如果选中的是二代身份证 var birthDateValue = document.getElementById('idNu ...
- 随机手机号和身份证号码(python)
在使用selenium2 python自动化过程中,用户添加的时候程序设置的手机号和身份证号码是唯一的,这方面python代码可以实现,以下是调试成功,可以实现的. 具体代码如下 身份证需要下载dis ...
- python 识别身份证号码
# !/usr/bin/python # -*-coding:utf-8-*- import sys import time time1 = time.time() from PIL import I ...
- Python实现身份证号码有效性验证
# -*- coding: utf-8 -*- import re #Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!' ...
- python实现获取身份证号码的方法
记录瞬间 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.2.地址码 表示编码 ...
- C#解决从含身份证号码的Excel表格导入数据库的问题
用C#做从Excel表导入SQL数据库时发现从EXCEL导入的身份证号码会变成科学表示方法. 解决这个问题是比较容易的,首先,打开电子表格,选中“身份证号码”一列,右键选择“设置单元格格式”,进入单元 ...
- C#验证身份证号码
一.18位的身份证号码 如:130429####%%%%00781.1~6位为地区代码,其中1.2位数为各省级政府的代码,3.4位数为地.市级政府的代码,5.6位数为县.区级政府代码.如13(河北省) ...
- PHP根据身份证号码验证、获取星座、生肖和性别函数
首先介绍一下身份证含义 新的18位身份证号码各位的含义:1-2位省.自治区.直辖市代码:3-4位地级市.盟.自治州代码:5-6位县.县级市.区代码:7-14位出生年月日,比如19670401代表196 ...
随机推荐
- Spring、SpringMVC、Mybaitis框架配置
给大家推荐2个网址,介绍的非常详细 SSM环境搭建 http://blog.csdn.net/zhshulin/article/details/37956105 SSM代码生成工具介绍 http:// ...
- MySQL 如何修改字符集 utf8 改为 utf8mb4
在实行sql server 向 mysql 迁移数据时,报错: Incorrect string value: '\xF0\x9F\x98\x8A' 原因是mysql 采用的是 utf8 的字符集,而 ...
- eclipse插件本地扩展安装
(1)在Eclipse 安装路径下新建links 路径. (2) 在links 文件夹内,建立X X X .link 文件,该文件的文件名可随意,但后缀必须是link ,通常推荐该文件的文件名与插件名 ...
- Apache CXF自定义拦截器
为什么设计拦截器?1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器 拦截器分类: 1.按所处的位置分:服务器端拦截器,客户端拦截器. 2.按消息的方向分:入拦截器 ...
- 进制,原码VS补码
进制 十,八,十六进制=>二进制 十进制=>二进制:辗转相除取余,10除2商5余0,5除2商2余1,2除2商1余0,1除2商0余1,So,10d=1010b 八进制=>二进制:每1位 ...
- APP 接口开发及读取静态缓存
<?php /** * Description: App 接口 * Create date:2015-10-19 13:36 * Author: zhaoyingnan **/ class Re ...
- ubuntu 添加启动器
终于搞定了安卓开发环境,不知道折腾了多少次,多少个IDE,解决了一个问题,又冒出一个问题.烦死了,最后关头,都快放弃了,重启电脑,打开 android stuio 编译运行居然陈宫了,没有报错,why ...
- C# Graphic 绘制圆、三角形、椭圆、图片
在form和panel上可以绘制图形,线段,圆,文字,图形等等. 绘制代码必须放在OnPaint()函数里面,因为窗体刷新的时候,都会调用该函数,重新刷新所绘的图. 示例代码在Panel上绘制图形来简 ...
- CANopen DS301协议中文翻译V03版
V0.1版PDF格式供下载参考,只是全面框架翻译,会有大量错误和不确定的地方,希望读者积极参与校对,提供修改意见,完善译文.下载 V0.2版校对提前完成,下载地址 V0.3版使用GitBook编辑(h ...
- 深搜+DP剪枝 codevs 1047 邮票面值设计
codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description ...