刚刚在扒12306能改火车席位的代码,貌似这个bug现在已经被修复了。
不过扒的过程中发现了身份证验证的一段代码,就研究了一下,发现果然不是随便生成的[哈哈]。
来说一下18位的身份证号码:
前6位号码是地区编号,(地址码) 其中前两位是省份。
中间8位是出生年月日。
再3位 是顺序码,貌似是那一天第多少个出生的。(这3位的最后一位,也就是身份证号码的第17位,奇数为男偶数为女)
最后1位,校验码,验证身份证号真伪。
验证码的算法:
1:身份证号码前17位数分别乘以以下系数:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;
2:将以上分别相乘得到的结果相加:
第一位*7 + 第二位*9 +…… + 第17位*2
3:以上结果除以11,得出余数;
4:余数0-10 分别对应下数字:1,0,X,9,8,7,6,5,4,3,2。(0=>1,1=>0,2=>X,3=>9……)。
上面那个数字就是第18位
以下代码扒自12306
function validateFirIdCard(g) {
var f = 0;
var a;
var e = {
11 : "北京",
12 : "天津",
13 : "河北",
14 : "山西",
15 : "内蒙",
21 : "辽宁",
22 : "吉林",
23 : "黑龙",
31 : "上海",
32 : "江苏",
33 : "浙江",
34 : "安徽",
35 : "福建",
36 : "江西",
37 : "山东",
41 : "河南",
42 : "湖北",
43 : "湖南",
44 : "广东",
45 : "广西",
46 : "海南",
50 : "重庆",
51 : "四川",
52 : "贵州",
53 : "云南",
54 : "西藏",
61 : "陕西",
62 : "甘肃",
63 : "青海",
64 : "宁夏",
65 : "新疆",
71 : "台湾",
81 : "香港",
82 : "澳门",
91 : "国外"
};
if (g.length == 15) {
a = idCardUpdate(g)
} else {
a = g
}
if (!/^\d{17}(\d|x)$/i.test(a)) {
return false
}
a = a.replace(/x$/i, "a");
if (e[parseInt(a.substr(0, 2))] == null) {
return false
}
var c = a.substr(6, 4) + "-" + Number(a.substr(10, 2)) + "-" + Number(a.substr(12, 2));
var h = new Date(c.replace(/-/g, "/"));
if (c != (h.getFullYear() + "-" + (h.getMonth() + 1) + "-" + h.getDate())) {
return false
}
for (var b = 17; b >= 0; b--) {
f += (Math.pow(2, b) % 11) * parseInt(a.charAt(17 - b), 11)
}
if (f % 11 != 1) {
return false
}
return true
}
function idCardUpdate(g) {
var b;
var f = /^(\d){15}$/;
if (f.test(g)) {
var e = 0;
var a = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var d = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2");
g = g.substr(0, 6) + "19" + g.substr(6, g.length - 6);
for (var c = 0; c < g.length; c++) {
e += parseInt(g.substr(c, 1)) * a[c]
}
g += d[e % 11];
b = g
} else {
b = "#"
}
return b