身份证校验

来源:互联网 发布:页游古龙群侠传改数据 编辑:程序博客网 时间:2024/04/30 17:56
/** * 此文件为一套完整的身份证操作工具。包含了校验以及根据身份证号取得年龄,出生日期,性别的方法。 *  * @authorjiangxia@isoftstone.com */var idTool = {/** * 地区对应的编码 * @type  */area : {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 : "国外"},/** * 校验身份证号码是否正确。如果校验正确则返回"success",否则将返回对应的提示信息 * @param {} idcard * @return {} */checkIdCard : function(idcard) {//var Errors = new Array("success", "身份证号码位数不对!", "身份证号码出生日期超出范围或含有非法字符!",//"身份证号码校验错误!", "身份证地区非法!");var Errors = new Array("success", "身份证号码输入有误!", "身份证号码输入有误!","身份证号码输入有误!", "身份证号码输入有误!");var retflag = false;var idcard, Y, JYM;var S, M;var idcard_array = new Array();idcard_array = idcard.split("");// 地区检验if (idTool.area[parseInt(idcard.substr(0, 2))] == null)return Errors[4];// 身份号码位数及格式检验switch (idcard.length) {case 15 :if ((parseInt(idcard.substr(6, 2)) + 1900) % 4 == 0|| ((parseInt(idcard.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(idcard.substr(6, 2)) + 1900)% 4 == 0)) {ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;// 测试出生日期的合法性} else {ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;// 测试出生日期的合法性}if (ereg.test(idcard))return Errors[0];else {return Errors[2];}break;case 18 :// 18位身份号码检测// 出生日期的合法性检查// 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))// 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))if (parseInt(idcard.substr(6, 4)) % 4 == 0|| (parseInt(idcard.substr(6, 4)) % 100 == 0 && parseInt(idcard.substr(6, 4))% 4 == 0)) {ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;// 闰年出生日期的合法性正则表达式} else {ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;// 平年出生日期的合法性正则表达式}if (ereg.test(idcard)) {// 测试出生日期的合法性// 计算校验位S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10]))* 7+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11]))* 9+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12]))* 10+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13]))* 5+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14]))* 8+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15]))* 4+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16]))* 2+ parseInt(idcard_array[7]) * 1+ parseInt(idcard_array[8]) * 6+ parseInt(idcard_array[9]) * 3;Y = S % 11;M = "F";JYM = "10X98765432";M = JYM.substr(Y, 1);// 判断校验位if (M == idcard_array[17].toUpperCase())return Errors[0]; // 检测ID的校验位elsereturn Errors[3];} elsereturn Errors[2];break;default :return Errors[1];break;}},/** * 通过身份证号码获取性别返回值为 0(“女”)  1 (“男”) * @param {} idcard * @return {} */getSex : function(idcard) {if (idcard.length == 15) {return idcard.substr(14, 1) % 2;} else if (idcard.length == 18) {return idcard.substr(16, 1) % 2;} else {return null;}},/** * 通过身份证号码获取年龄 * @param {} idcard * @return {} */getAge : function(idcard) {var birthday = idTool.getBirthDay(idcard);var today=new Date();var bday;if(birthday.length == 6) {bday = new Date(birthday.substring(0,2),birthday.substring(2,4),birthday.substring(4,6));} else if (birthday.length == 8) {bday = new Date(birthday.substring(0,4),birthday.substring(4,6),birthday.substring(6,8));} else {return null;}return Math.ceil((today - bday)/(365*24*60*60*1000));},/** * 通过身份证号码获取出生年月日  * @param {} idcard身份证号码 * @return {}返回格式为yyMMdd(15位)或者 yyyyMMdd(18为)的年月日 * @authorjiangxia@isoftstone.com */getBirthDay : function(idcard) {if (idcard.length == 15) {return idcard.substr(6, 2) + idcard.substr(8, 2) + idcard.substr(10, 2);} else if (idcard.length == 18) {return idcard.substr(6, 4) + idcard.substr(10, 2) + idcard.substr(12, 2);} else {return null;}}}


 

18位身份证号码最后一位校验码的计算方法

公民身份号码是一系列组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
前六位的内容可以通过建立数据库存储相应信息,由于全国行政区划每年都在发生变化,需要经常更新。

最后一位的校验码计算方法如下:
(1)十七位数字本体码加权求和公式,先对前17位数字加权求和
S = Sum(Ai×Wi), i = 0,1,2,...,16
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子,Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2)计算模
Y = mod(S, 11)
Y是S除以11的余数,数学上简称模。

(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10

校验码: 1 0 X 9 8 7 6 5 4 3 2