轉自:http://www.biaodianfu.com/id-number.htmlhtml
居民×××號碼,根據〖×××國家標準 GB 11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次爲:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。python
1、×××號碼的組成ide
一、地址碼(×××號碼前六位)post
表示編碼對象常住戶口所在縣(市、鎮、區)的行政區劃代碼。1-2位省、自治區、直轄市代碼; 3-4位地級市、盟、自治州代碼; 5-6位縣、縣級市、區代碼。網站
關於行政區劃代碼具體的對應關係,能夠從×××網站上直接獲取。編碼
具體地址爲:http://www.stats.gov.cn/tjbz/xzqhdm/code
二、生日期碼(×××號碼第七位到第十四位)htm
表示編碼對象出生的年、月、日,其中年份用四位數字表示,年、月、日之間不用分隔符。例如:1981年05月11日就用19810511表示。對象
三、順序碼(×××號碼第十五位到十七位)get
地址碼所標識的區域範圍內,對同年、月、日出生的人員編定的順序號。其中第十七位奇數分給男性,偶數分給女性。
四、校驗碼(×××號碼最後一位)
是根據前面十七位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。做爲尾號的校驗碼,是由號碼編制單位按統一的公式計算出來的,若是某人的尾號是0-9,都不會出現X,但若是尾號是10,那麼就得用X來代替。
2、×××校驗碼計算方法
將前面的×××號碼17位數分別乘以不一樣的係數。從第一位到第十七位的係數分別爲:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
將這17位數字和係數相乘的結果相加。
用加出來和除以11,看餘數是多少?
餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最後一位×××的號碼爲1-0-X -9-8-7-6-5-4-3-2。經過上面得知若是餘數是2,×××的最後一位號碼就是羅馬數字x。若是餘數是10,就會在×××的第18位數字上出現的是2。
3、×××校驗Python版
#-*- coding:UTF-8 -*- import re from datetime import datetime __all__ = ["GeneratIdentityChecker"] class ExceptionIdentityChecker(Exception): pass def GeneratIdentityChecker(country = "China"): cls = globals().get(country+"IdentityChecker") if cls: return cls() else: raise ExceptionIdentityChecker(country+" identity's checker not found") class ChinaIdentityChecker(): def __init__(self): self.anWi = (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2) self.cnAreaPart = 6 self.cnMod = 11 self.csYearPre = "19" self.csCheckCode = "10X98765432" self.cnMinArea = 150000 self.cnMaxArea = 700000 def check(self,code,**options): code = code.upper() if len(code) not in (15,18) or not re.match(r"^\d{15}$|^\d{17}[\dxX]$", code): return False area = int(code[0:self.cnAreaPart]) if not (self.cnMinArea <= area <= self.cnMaxArea): return False birthday = self.csYearPre+code[6:12] if len(code) == 15 else code[6:14] try: datetime.strptime(birthday, "%Y%M%d") except: return False if len(code) == 18: wi = self.anWi total = 0 for i in range(16,-1,-1): total += int(code[i])*wi[i] if not self.csCheckCode[total%self.cnMod] == code[17]: return False for i in options: try: checker = getattr(self,"_check_"+i) except: return False if not checker(code,options[i]): return False return True def _check_sex(self,code,sex): sex_flag = code[14] if len(code) == 15 else code[16] sex = sex.upper() if sex == "M": return int(sex_flag)%2 == 1 elif sex == "F": return int(sex_flag)%2 == 0 else: return False if __name__ == "__main__": gic = GeneratIdentityChecker() print gic.check("34052419800101001X")