您的位置:首页 > Web前端 > JavaScript

身份证号码验证js

2013-01-14 17:00 274 查看
/*
功能:验证身份证号码是否有效
提 示信息:未输入或输入身份证号不正确!
使用:validateIdCard(obj)
返回:0,1,2,3
*/
function validateIdCard(obj)
{
var aCity={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:"国 外"};
var iSum = 0;
//var info = "";
var strIDno = obj;
var idCardLength = strIDno.length;
if(!/^\d{17}(\d|x)$/i.test(strIDno)&&!/^\d{15}$/i.test(strIDno))
return 1; //非法身份证号

if(aCity[parseInt(strIDno.substr(0,2))]==null)
return 2;// 非法地区

// 15位身份证转换为18位
if (idCardLength==15)
{
sBirthday = "19" + strIDno.substr(6,2) + "-" + Number(strIDno.substr(8,2)) + "-" + Number(strIDno.substr(10,2));
var d = new Date(sBirthday.replace(/-/g,"/"))
var dd = d.getFullYear().toString() + "-" + (d.getMonth()+1) + "-" + d.getDate();
if(sBirthday != dd)
return 3; //非法生日
strIDno=strIDno.substring(0,6)+"19"+strIDno.substring(6,15);
strIDno=strIDno+GetVerifyBit(strIDno);
}

// 判断是否大于2078年,小于1900年
var year =strIDno.substring(6,10);
if (year<1900 || year>2078 )
return 3;//非法生日

//18位身份证处理

//在后面的运算中x相当于数字10,所以转换成a
strIDno = strIDno.replace(/x$/i,"a");

sBirthday=strIDno.substr(6,4)+"-"+Number(strIDno.substr(10,2))+"-"+Number(strIDno.substr(12,2));
var d = new Date(sBirthday.replace(/-/g,"/"))
if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))
return 3; //非法生日
// 身份证编码规范验证
for(var i = 17;i>=0;i --)
iSum += (Math.pow(2,i) % 11) * parseInt(strIDno.charAt(17 - i),11);
if(iSum%11!=1)
return 1;// 非法身份证号

// 判断是否屏蔽身份证
var words = new Array();
words = new Array("11111119111111111","12121219121212121");

for(var k=0;k<words.length;k++){
if (strIDno.indexOf(words[k])!=-1){
return 1;
}
}

return 0;
}


附录:

身份证号码编码方法

要进行身份证号码的验证,首先要了解身份证号码的编码规则。我国身份证号码多由若干位数字或者数字与字母混合组成。早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,后来考虑到千年虫问题,因为15位的身份证号码只能为1900年1月1日到1999年12月31日出生的人编号,所以又增加了18位身份证号码编号规则。

15位身份证号码编码较为简单,从左到右其15位码依次为:

1 2 3 4 5
6 7 8 9 10 11
12 13 14 15

A A A A A
A Y Y M M D
D N N S

前六位AAAAAA是身份证编码对象的所在地(出生地)的编码,该号码可由国家统计局公布的相关标准中得到。YY表示出生年的后两位,MM和DD表示出生月和日,不足两位的高位补0,NNS为顺序号,无法确定。S为性别识别码,男性为奇数,女性为偶数。例如,一位于1965年2月16日出生在湖北省巴东县的女性的15位身份证号码为:

1 2 3 4 5
6 7 8 9 10 11
12 13 14 15

A A A A A
A Y Y M M D
D N N S

4 2 2 8 2
3 6 5 0 2
1 6 0 2 2

18位身份证号码比15位身份证号码多出的3位中的两位用来补充2位的年份为4位,另外1位作为校验码存在。一项由国家质量技术监督局发布的标准对身份证号码的编码规则做了具体的规定。该标准为名《公民身份号码》,编号GB11643-1999,为国家强制标准。它代替了1989年公布的名为《社会保障号码》GB11643-1989国家强制标准,从1999年7月1日开始强制实施。该标准的内容介绍如下。

1.标准适用范围:规定了公民身份号码的编码对象、号码的具体结构组成和表现形式,并规定每个编码对象将获得一个唯一的、终身不变的号码。

2.编码对象:具有中国人民共和国国籍的公民。

3.号码的结构组成和表现形式。

该标准中对号码的构造组成和表现形式进行了如下的阐述:

号码由17位本体码和1位校验码组成,这18位号码从左到右依次为:

1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17 18

A A A A A
A Y Y Y Y
M M D D N N
S C

前六位AAAAAA同样是地区编码,按照国家推荐标准GB/T2260的规定进行编码。YYYY是扩充后的四位出生年码,MM和DD为出生月和日码,不足两位的仍然在高位补0。NNS为无法确定的顺序码,其中S为性别识别码,同样将奇数分配给男性,偶数分配给女性。第18位校验位是对前17位进行如下的计算得到的。

使用数组B[I]表示从左到右第I个数字,W[I]表示第I位上的加权因子,需要注意的是,为了方便讲述,这里的数组第一个是B[1]而不是计算机中的B[0],W[I]也是同样。加权因子依次为:

1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17

7 9 10 5 8 4
2 1 6 3 7
9 10 5 8 4
2

得到第18位的值C首先要利用这个加权因子计算出 的值, 的计算公式为:

即,将前17位的数字与其对应的加权因子相乘,再将积相加,最后的和再除以11,取其余。除以11最后的余有11种可能,从0到10。通过余再做一个转换,即可得到相应的第18位上的校验码,余数和校验码的转换如下:

余数
0
1 2 3 4 5
6 7 8 9 10

对应的校验码
1 0 X 9
8 7 6 5 4
3 2

下面我们来计算一下一位湖北省襄樊市襄城区在1986年11月9日出生的男性的18位身份证号码,其顺序号假定为321(男性为奇数)。该身份证号前17位为:

4 2 0 6 8
2 1 9 8 6
1 1 0 9 3
2 1

先计算前17位与加权因子的积的和除以11的余:

余数为1则其对应的第18位校验码为0,该男性的18位身份证号码为:

4 2 0 6 8
2 1 9 8 6
1 1 0 9 3
2 1 0

校验码可以作为一种判断一个正确的身份证号的前17位是否有错误发生的标准,但这并不一定在任何情况下都是有效的,在某些情况下的错误也是这个校验位无法检测的,比如,多个数字发生错误,例如,当上例中的身份证号码由42068219861109321变为42098219861106321后,其校验码仍为0。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: