在網站中,總有各類各樣的表單,用戶使用表單來向服務器發送數據,進行交互。 然而,代代相傳的經驗是,永遠不要信任用戶的輸入,必定要對數據進行驗證。若是使用不經驗證的表單,輕則會有大量無效提交進入服務器,嚴重影響網站運行;重則招致XSS攻擊~ 因此對輸入進行驗證是必要的。而爲了減輕服務器的壓力,除了密碼正誤等須要向數據庫交互才能驗證的輸入以外,絕大部分輸入的驗證都應當在前端進行。其中,身份證號的校驗就是很是常見的一個。
身份證號是中華人民共和國公民的身份編號,有15位(第一代身份證)和18位兩種。第一代身份證所採用的15位身份證號,因爲沒有校驗位,故沒法進行驗證,這裏咱們討論現今絕大多數人所使用的18位身份證號的驗證方法。15位身份證號也能夠經過下面的原理轉換成18位身份證號,這裏就不列出方法了~ 18位身份證號碼的構成以下:
XXXXXX
XXXXXXXX
XXX
X
第1-6位:1-2位表示省級行政區代碼;3-4位表示地級行政區代碼;5-6位表示縣級行政區代碼
第7-14位:出生年月日
第15-17位:順序碼,其中奇數分配給男性,偶數分配給女性
第18位:校驗碼
咱們對身份證號的正確性進行驗證,就是利用最後一位校驗位來進行的~而校驗位的算法是這樣的:
公民身份證號碼中各個位的數字應知足如下公式的校驗:
其中:i表示身份證號低位到高位的位序號
ai表示該位置上的號碼字符值
Wi表示該位置上的加權因子,其計算方法:
。各個位的Wi值可直接引用下表:
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 |
根據上面的公式,能夠推算出校驗位與其餘位校驗關係:
。
對於沒學過數論的同窗(其實我也是現學的),再說一下「同餘「的概念:
給定一個正整數
m,若是兩個整數a和b知足a-b能被m整除,即m|(a-b),那麼就稱整數a與b對模m同餘,記做a≡b(mod m)。
綜上:最終推導出驗證身份證號所用的表達式:
若上方表達式成立,則該身份證號有效。
下面是在JavaScript中的方法實現:
function checkId(){
var code = /* 這裏是要校驗的身份證號 字符串或者數字均可以 */;
if(code.length == 18){
if(checkMod(code) == true){
alert("正確");
}
else alert("輸入的身份證號不正確");
}
else alert("輸入的身份證號格式錯誤。");
}
function checkMod(code){
var arr = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],//從第18位到第2位的Wi
proof = code.charAt(17).toUpperCase() == "X" ? 10 : parseInt(code.charAt(17)),//獲得輸入身份證號的最後一位並將X轉換爲10
sum = 0;//前十七位的校驗和
for(var i = 0;i < arr.length;i++){
sum += code.charAt(i) * arr[i];
}
return (proof + sum - 1) % 11 == 0;
}
完整Demo下載: