乐虎游戏|乐虎国际登录|欢迎你

基于Python的身份证号码自动生成程序,python身份证号码

日期:2020-01-05编辑作者:计算机资讯

基于Python的身份证号码自动生成程序,python身份证号码

需求细化:

1.身份证必须能够通过身份证校验程序。

2.通过查询,发现身份证号码是有国家标准的,标准号为 GB 11643-1999 可以从百度下载到这个文档

下载:GB11643-1999sfz(jb51.net).rar

现行身份证号为18位,分别为6位地址码,8位生日,3位顺序码,一位校验码。具体例子可见下图。

  图片 1

  前六位也是国家标准,GB2260-2007。吐槽一下,国标竟然没有一个网站供全面检索和免费下载。。。还好国家统计局有这些公开数据。可以从统计数据-》统计标准-》行政区划代码页面内找到最新数据: (这个网页上的数据可能会旧)

出生年月日是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 ={'0':'1','1':'0','2':'X','3':'9','4':'8','5':'7','6':'6','7':'5','8':'5','9':'3','10':'2'} #校验码映射
  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较多,因此打算用python实现。

/**
* 公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:
* 六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
* 1、地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按 GB/T 2260 的规定执行。
* 2、出生日期码:表示编码对象出生的年、月、日,按 * GB/T 7408 的规定执行。年、月、日代码之间不用分隔符。
* 例:某人出生日期为 1966年10月26日,其出生日期码为 19661026。
* 3、顺序码:表示在同一地址码所标识的区域范围内,
* 对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数千分配给女性。
* 4、校验码:校验码采用ISO 7064:1983,MOD 11-2 校验码系统。
* (1)十七位数字本体码加权求和公式
* S = Sum(Ai * Wi), i = * 0, ... , 16 ,先对前17位数字的权求和
* Ai:表示第i位置上的身份证号码数字值
* Wi:表示第i位置上的加权因子
* Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
* (2)计算模 Y = mod(S, 11)
* (3)通过模得到对应的校验码
* Y: 0 1 2 3 4 5 6 7 8 9 10
* 校验码: 1 0 X 9 8 7 6 5 4 3 2
*/
public class IDCard {
// 加权因子
private static final int[] weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6,
3, 7, 9, 10, 5, 8, 4, 2, 1 };
// 校验码
private static final int[] checkDigit = new int[] { 1, 0, 'X', 9, 8, 7, 6,
5, 4, 3, 2 };

自动生成身份证号码的程序

求一C语言程序,输入身份证号前17位,自动生成最后一位更好是输入14位,:输入可以是18位身份证前17位,或老版的15位身份证号码 ********/ #  

 

public IDCard() {
}
/**
* 验证身份证是否符合格式
* @param idcard
* @return
*/
public boolean Verify(String idcard) {
if (idcard.length() == 15) {
idcard = this.update2eighteen(idcard);
}
if (idcard.length() != 18) {
return false;
}
//获取输入身份证上的最后一位,它是校验码
String checkDigit = idcard.substring(17, 18);
//比较获取的校验码与本方法生成的校验码是否相等
if (checkDigit.equals(this.getCheckDigit(idcard))) {
return true;
}
return false;
}

C语言程序自动生成身份证号

老版应当要15位都给出,给14位好像不行。

/*************************************************************
*Author :wacs5
*date :20101031(YYYMMDD)
*Function :计算身份证最后一位校验位(没有验证日期的可行性)
* :输入可以是18位身份证前17位,或老版的15位身份证号码
************************************************************/
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
int i,n;
int sum;
char id[40];
int weight[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char checkbit[11]="10X98765432";
while (1)
{
printf("Input ID NO.:");
fflush(stdin);
scanf("%[0-9]s",id);
if (strlen(id)==15 || strlen(id)==17)
break;
system("cls");
printf("Input Error:n");
}
printf("nYour input ID head=%sn",id);
if (strlen(id)==17) /*新版*/
{
sum=0;
for (i=0;i<17;i++)
sum+=(id[i]-'0')*weight[i];
sum%=11;
id[17]=checkbit[sum];
}
else /*老身份证*/
{
for (i=16;i>=8;i--) /*移位*/
id[i]=id[i-2];
id[6]='1'; /*添加19信息*/
id[7]='9';

sum=0;
for (i=0;i<17;i++)
sum+=(id[i]-'0')*weight[i];
sum%=11;
id[17]=checkbit[sum];
}
printf("ID NO.=%sn",id);
getch();
}...余下全文>>  

需求细化: 1.身份证必须能够通过身份证校验程序。 2.通过查询,发现身份证号码是...

  需求细化

/**
* 计算18位身份证的校验码
* @param eighteenCardID 18位身份证
* @return
*/
private String getCheckDigit(String eighteenCardID) {
int remaining = 0;
if (eighteenCardID.length() == 18) {
eighteenCardID = eighteenCardID.substring(0, 17);
}

1.身份证必须能够通过身份证校验程序。

if (eighteenCardID.length() == 17) {
int sum = 0;
int[] a = new int[17];
//先对前17位数字的权求和
for (int i = 0; i < 17; i++) {
String k = eighteenCardID.substring(i, i + 1);
a[i] = Integer.parseInt(k);
}
for (int i = 0; i < 17; i++) {
sum = sum + weight[i] * a[i];
}
//再与11取模
remaining = sum % 11;
}
return remaining == 2 ? "X" : String.valueOf(checkDigit[remaining]);
}

2.通过查询,发现身份证号码是有国家标准的,标准号为  GB 11643-1999  可以从百度下载到这个文档

/**
* 将15位身份证升级成18位身份证号码
* @param fifteenCardID
* @return
*/
private String update2eighteen(String fifteenCardID) {
//15位身份证上的生日中的年份没有19,要加上
String eighteenCardID = fifteenCardID.substring(0, 6);
eighteenCardID = eighteenCardID + "19";
eighteenCardID = eighteenCardID + fifteenCardID.substring(6, 15);
eighteenCardID = eighteenCardID + this.getCheckDigit(eighteenCardID);
return eighteenCardID;
}

现行身份证号为18位,分别为6位地址码,8位生日,3位顺序码,一位校验码。具体例子可见下图。

/**
* @param args
*/
public static void main(String[] args) {
IDCard test = new IDCard();
String idCardStr = "110105194912310025";
System.out.println("身份证" + idCardStr + "验证合格? "

图片 2

  • test.Verify(idCardStr));
    idCardStr = "440524188001010014";
    System.out.println("身份证" + idCardStr + "验证合格? "
  • test.Verify(idCardStr));
    }
    }

前六位也是国家标准,GB2260-2007。吐槽一下,国标竟然没有一个网站供全面检索和免费下载。。。还好国家统计局有这些公开数据。可以从统计数据-》统计标准-》行政区划代码页面内找到最新数据: (这个网页上的数据可能会边旧)

出生年月日是8位

顺序码是3位,男生末尾为基数,女生末尾为偶数。

最后一位是校验码。校验算法其实后面有很多数学道理,这里给出最简单的公式:

前17位数字每一位有一个权重值

将第i位上的权重值记作Wi,Wi的值为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

本文由乐虎游戏发布于计算机资讯,转载请注明出处:基于Python的身份证号码自动生成程序,python身份证号码

关键词:

分享一些非常实用的 Vim 命令

分享一些非常实用的 Vim 命令 我明确地说,我是一个 Vim的粉丝。所以在你们中的某些人向我扔石头之前,我先向你们...

详细>>

Python判定变量是不是早就定义的主意,python决断变量定义

Python判断变量是否已经定义的方法,python判断变量定义 Python判断变量是否已经定义是一个非常重要的功能,本文就来...

详细>>

Python内置的字符串处理函数详细整理(覆盖日常所用),python内置

Python内置的字符串处理函数详细整理(覆盖日常所用),python内置 str='python String function' 生成字符串变量str='python Strin...

详细>>

如何实现div水平和垂直居中效果,div水平垂直居中

如何实现div水平和垂直居中效果,div水平垂直居中 如何实现div水平垂直和居中效果: 有时候可能我们需要让一个div在...

详细>>