您好,登錄后才能下訂單哦!
這篇文章給大家介紹Python中怎么隨機生成身份證號碼并實現校驗功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
身份組成方式
中華人民共和國國家標準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
關于Python中怎么隨機生成身份證號碼并實現校驗功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。