身份證是國民的身份編號,編號是有一定規(guī)律的,這里介紹身份證驗證規(guī)則比較詳細。
下面我說一下15位跟18位身份證號的區(qū)別:
15位的身份證號
dddddd yymmdd xx p
18位的身份證號
dddddd yyyymmdd xx p y
其中dddddd為地址碼(省地縣三級)18位中的和15位中的不完全相同
yyyymmdd yymmdd 為出生年月日
xx順號類編碼
p性別
將前17位的ascii碼值經(jīng)位移、異或運算結(jié)果不在0-9的令其為x
這里我們可以看出15位跟18位的?出生年和校驗碼有區(qū)別
我下面說一下我們會用到的校驗碼的計算方法:
將前面的身份證號碼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é)果相加。
用加出來和除以11,看余數(shù)是多少? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
余數(shù)只可能有0-1-2-3-4-5-6-7-8-9-10這11個數(shù)字。其分別對應(yīng)的最后一位身份證的號碼為1-0-X -9-8-7-6-5-4-3-2。
通過上面得知如果余數(shù)是3,就會在身份證的第18位數(shù)字上出現(xiàn)的是9。如果對應(yīng)的數(shù)字是10,身份證的最后一位號碼就是羅馬數(shù)字x。
例如:某男性的身份證號碼為【53010219200508011x】, 我們看看這個身份證是不是合法的身份證。
首先我們得出前17位的乘積和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,然后用189除以11得出的結(jié)果是189/11=17----2,也就是說其余數(shù)是2。最后通過對應(yīng)規(guī)則就可以知道余數(shù)2對應(yīng)的檢驗碼是X。所以,可以判定這是一個正確的身份證號碼。
身份證個特征碼代表意義(僅限18位身份證)

知道驗證規(guī)則就比較好辦了,根據(jù)驗證規(guī)則校驗就可以了。
首先我們驗證公民身份證的地區(qū)特征碼 代碼如下:

這段我只是做了簡單的省代碼驗證, 由于縣級以上的區(qū)域劃分代碼太多,我就不做前6位所有地區(qū)的校驗了(后續(xù)校驗碼計算也會用到前面的6位地區(qū)碼 個人感覺不用做的那么細,有興趣的話大家可以嘗試下)
接下來是時間的合法性校驗這里對于15位和18位的身份證會有所區(qū)別:
15位校驗時間合法性

18位校驗時間合法性和檢驗碼合法性

上面我們說了15位跟18位身份證 在出生年和校驗碼上有區(qū)別我分別對他們做了特殊處理,使用正則給身份證號碼做格式校驗(包括時間校驗)?15位的只做了時間的合法性驗證, 18位的多一個校驗碼校驗 。根據(jù)計算公式。計算公式是從第一位到第十七位的系數(shù)分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。將身份證前17位數(shù)字和這些系數(shù)相乘的結(jié)果相加,再除以11,得到看余數(shù)然后是幾? 然后看對應(yīng)1-0-X -9-8-7-6-5-4-3-2里面的第幾個就是校驗碼,然后與原始數(shù)據(jù)最后一位比較。
總結(jié)
身份證校驗?zāi)壳?5位的身份證已經(jīng)作廢 ?個人覺得如果為保障一人只有一張卡的話最好把15位的驗證過濾掉 防止一個人同時使用新舊兩個身份證
身份證校驗只要知道計算公式其實計算進行校驗很簡單 只要記住相乘系數(shù)和對應(yīng)校驗碼就直接可以計算出校驗碼來進行比較
第一次寫簡書 寫的不好請見諒