1实撒、身份證號(hào)碼結(jié)構(gòu)簡介
1.號(hào)碼的結(jié)構(gòu)
公民身份號(hào)碼是特征組合碼怪瓶,由十七位數(shù)字本體碼和一位校驗(yàn)碼組成畏浆。排列順序從左至右依次為:六位數(shù)字地址碼竟终,八位數(shù)字出生日期碼僵井,三位數(shù)字順序碼和一位數(shù)字校驗(yàn)碼维费。
2.地址碼
表示編碼對(duì)象常住戶口所在縣(縣級(jí)市蝶缀、旗扩借、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行贱鄙。
3.出生日期碼
表示編碼對(duì)象出生的年劝贸、月、日逗宁,按GB/T7408的規(guī)定執(zhí)行映九,年、月瞎颗、日代碼之間不用分隔符件甥。
4.順序碼
表示在同一地址碼所標(biāo)識(shí)的區(qū)域范圍內(nèi),對(duì)同年哼拔、同月引有、同日出生的人編定的順序號(hào),順序碼的奇數(shù)分配給男性倦逐,偶數(shù)分配給女性譬正。
5.校驗(yàn)碼
根據(jù)前面十七位數(shù)字碼,按照ISO 7064:1983.MOD 11-2校驗(yàn)碼計(jì)算出來的檢驗(yàn)碼檬姥。
2曾我、身份證號(hào)碼尾號(hào)算法示例
比如身份證號(hào)碼前17位為:11011119900203123
第一步、將前面的身份證號(hào)碼17位數(shù)分別乘以不同的系數(shù)健民。從第一位到第十七位的系數(shù)分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 您单,并且將這17位數(shù)字和系數(shù)相乘的結(jié)果相加
例如:1x7+1x9+0x10+1x5+1x8+1x4+1x2+9x1+9x6+0x3+0x7+2x9+0x10+3x5+1x8+2x4+3x2 = 153
第二步、用加出來和除以11荞雏,看余數(shù)是多少;
例如:153 / 11 = 13余10平酿,余數(shù)為10
第三步凤优、余數(shù)只可能有0 1 2 3 4 5 6 7 8 9 10這11個(gè)數(shù)字。其分別對(duì)應(yīng)的最后一位身份證的號(hào)碼為1 0 X 9 8 7 6 5 4 3 2蜈彼;
例如:上一步中的余數(shù)為10筑辨,我們的校驗(yàn)位就是:2
所以,身份證號(hào)碼為:11011119900203123
用我之前寫的校驗(yàn)工具校驗(yàn)一下幸逆,確認(rèn)無誤:
3棍辕、全代碼
我們要實(shí)現(xiàn)的功能:輸入出生年月日,自動(dòng)隨機(jī)生成一個(gè)身份證號(hào)碼还绘;
# -*- coding: utf-8 -*-
# @Time : 2020/3/17 17:29
# @Author : felix
# @File : idNumber.py
# @Software: PyCharm
import random
#預(yù)設(shè)地區(qū):
codelist = ["110101","110102","110105","110106","110107","420117","420200","420202","420203","420204","420205","420222"] #隨便設(shè)置了幾個(gè)地區(qū)楚昭,基本都是湖北和北京的;
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] #權(quán)重項(xiàng)
checkcode ={'0':'1','1':'0','2':'X','3':'9','4':'8','5':'7','6':'6','7':'5','8':'5','9':'3','10':'2'} #校驗(yàn)碼映射
def newIdNum(birthyear,birthmonth,birthday):
#身份證前6位
try:
id = codelist[random.randint(0,len(codelist))] #地區(qū)項(xiàng)
except:
id = "110101"
#7-10位拍顷,出生年份
try:
birthdayStr = str(birthyear).zfill(4)+str(birthmonth).zfill(2)+str(birthday).zfill(2)
id = id + birthdayStr
except:
id = id + "19900101"
#最后4位的隨機(jī)前3位
sex = ""
try:
sign = random.randint(1,999)
if sign%2 == 0:
sex = "女"
else:
sex = "男"
id = id + str(sign).zfill(3) #順序號(hào)簡單處理
except:
id = id + "999"
#判斷性別
sum_1 = 0
for a in range(17):
sum_1 = sum_1+int(id[a])*weight[a]
index_id = sum_1%11
result_id = id + str(checkcode[str(index_id)]) #最終號(hào)碼
return (result_id,sex)
if __name__ == '__main__':
birthyear = input("請(qǐng)輸入出生年(例如:1990): ")
birthmonth = input("請(qǐng)輸入出生月(例如:10): ")
birthday = input("請(qǐng)輸入出生日(例如:2): ")
(id,sex) = newIdNum(birthyear,birthmonth,birthday)
print("身份證號(hào)碼為:%s抚太,性別:%s" %(id,sex))
測試輸出:
請(qǐng)輸入出生年(例如:1990): 1989
請(qǐng)輸入出生月(例如:10): 12
請(qǐng)輸入出生日(例如:2): 13
身份證號(hào)碼為:320200198912135760,性別:女
Process finished with exit code 0
請(qǐng)輸入出生年(例如:1990): 2010
請(qǐng)輸入出生月(例如:10): 12
請(qǐng)輸入出生日(例如:2): 3
身份證號(hào)碼為:420117201012031026,性別:女
Process finished with exit code 0