python 身份證號碼有效性校驗

2021-10-16 22:30:03 字數 2803 閱讀 1238

中華人民共和國國家標準gb 11643-1999《公民身份號碼》中規定:公民身份號碼是特徵組合碼,由17位數字本體碼和1位校驗碼組成。

18位數字組合的方式是:

其中,最後一位是校驗碼,它是由前17位數字按照某種計算方式計算出來的。校驗碼為一位數,但如果最後採用校驗碼系統計算的校驗碼是「10」,礙於身份證號碼為18位的規定,則以「x」代替校驗碼「10」。

計算方式如下:

將身份證號碼從左至右標記為a1,

a2,⋯

,a18\displaystyle a_,a_,\cdots ,a_

a1​,a2

​,⋯,

a18​

;a

18\displaystyle a_

a18​

即為校驗碼;

計算權重係數wi=

218−i

mod11

\displaystyle w_=2^\ }

wi​=21

8−im

od11

;其中mod

\displaystyle \ \bmod

mod表示求餘數。 iii1

2345

6789

1011

1213

1415

1617

w iw_

wi​7910

5842

1637

91058

42計算s =∑

i=117

ai⋅w

i\displaystyle s=\sum _^a_\cdot w_

s=i=1∑

17​a

i​⋅w

i​a 18=

(12−(

smod

11))

mod1

1\displaystyle a_=(12-(s\ }1))}1

a18​=(

12−(

smod

11))

mod1

1

def

main(id

):sum=

0for index, item in

enumerate(id

[:-1

]):sum+=2

**(17-index)%11

*int

(item)

num =(12

-sum%11

)%11if num <10:

return

'校驗通過'

ifid[-

1]==str

(num)

else f'校驗失敗,正確尾號應為:'

else

:return

'校驗通過'

ifid[-

1]=='x'

else f'校驗失敗,正確尾號應為:'

if __name__ ==

'__main__'

: test_id_1 =

'532527195503267352'

test_id_2 =

'53252719550326735x'

print

(main(test_id_1)

)print

(main(test_id_2)

)'''輸出

校驗通過

校驗失敗,正確尾號應為:2

'''

正確的校驗碼是身份證號碼有效性的必要條件,而非充分條件。要保證身份證號碼的有效性,其它條件也要滿足,比如號碼位數必須為18位,位址碼要符合中華人民共和國關於行政區劃**的規定,還有就是出身日期碼也要合法等等。有興趣的話,你可以自己程式設計實現。當然,這裡也提供乙個已經封裝好的python第三方庫id-validator

pip install id-validator
驗證身份證號是否合法,合法返回 true,不合法返回 false:

>>

>

from id_validator import validator

>>

> validator.is_valid(

'440308199901101512'

)true

>>

> validator.is_valid(

'44030819990110151x'

)false

當身份證號合法時,返回分析資訊(地區、出生日期、星座、生肖、性別、校驗位),不合法返回 false:

>>

>

from id_validator import validator

>>

> validator.get_info(

'440308199901101512'

)

偽造符合校驗的身份證:

>>

>

from id_validator import validator

>>

> validator.fake_id(

)'410704200302268552'

中華人民共和國公民身份號碼

Python 實現判斷身份證號碼的有效性

import re def check id card id card errors 驗證通過 身份證號碼位數不對 身份證號碼出生日期超出範圍或含有非法字元 身份證號碼校驗錯誤 身份證地區非法 area id card str id card id card id card.strip 刪除前後空格...

Python實現身份證號碼有效性驗證

coding utf 8 import re errors 驗證通過 身份證號碼位數不對 身份證號碼出生日期超出範圍或含有非法字元 身份證號碼校驗錯誤 身份證地區非法 def checkidcard idcard errors 驗證通過 身份證號碼位數不對 身份證號碼出生日期超出範圍或含有非法字元 ...

身份證號碼

每乙個人自出生後都會有乙個身份證號碼。根據我國有關部門規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為 六位數字位址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。居民身份證是國家法定的證明公民個人身份的有效證件。例如 對於身份證號碼330719...