在网站中,总有各类各样的表单,用户使用表单来向服务器发送数据,进行交互。 然而,代代相传的经验是,永远不要信任用户的输入,必定要对数据进行验证。若是使用不经验证的表单,轻则会有大量无效提交进入服务器,严重影响网站运行;重则招致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下载: