mysql校验规则居民身份证号_身份证号规则及校验
公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位數(shù)字校驗(yàn)碼組成。
排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼,最后一位是數(shù)字校驗(yàn)碼。
身份證最后一位是根據(jù)前面十七位數(shù)字碼,按照ISO 7064:1983.MOD 11-2校驗(yàn)碼計(jì)算出來的檢驗(yàn)碼。作為尾號的校驗(yàn)碼,是由號碼編制單位按統(tǒng)一的公式計(jì)算出來的,如果某人的尾號是0-9,都不會(huì)出現(xiàn)X,但如果尾號是10,那么就得用X來代替,因?yàn)槿绻?0做尾號,那么此人的身份證就變成了19位,而19位的號碼違反了國家標(biāo)準(zhǔn),并且我國的計(jì)算機(jī)系統(tǒng)也不承認(rèn)19位的身份證號碼。Ⅹ是羅馬數(shù)字的10,用X來代替10,可以保證公民的身份證符合國家標(biāo)準(zhǔn)。
計(jì)算方法
1、將前面的身份證號碼17位數(shù)分別乘以不同的系數(shù)。從第一位到第十七位的系數(shù)分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
2、將這17位數(shù)字和系數(shù)相乘的結(jié)果相加;
3、用加出來和除以11,看余數(shù)是多少;
4、余數(shù)只可能有0 1 2 3 4 5 6 7 8 9 10這11個(gè)數(shù)字。其分別對應(yīng)的最后一位身份證的號碼為1 0 X 9 8 7 6 5 4 3 2;
5、通過上面得知如果余數(shù)是2,就會(huì)在身份證的第18位數(shù)字上出現(xiàn)羅馬數(shù)字的X。如果余數(shù)是10,身份證的最后一位號碼就是2;
例如:某男性的身份證號碼是34052419800101001X。我們要看看這個(gè)身份證是不是合法的身份證。
首先:我們計(jì)算3*7+4*9+0*10+5*5+...+1*2,前17位的乘積和是189
然后:用189除以11得出的結(jié)果是商17余2
最后:通過對應(yīng)規(guī)則就可以知道余數(shù)2對應(yīng)的數(shù)字是x。所以,這是一個(gè)合格的身份證號碼。
1 //驗(yàn)證身份證號,成功則返回省份編號+出生日期+性別
2 functionidentifyCard(sId){3 //省份編號
4 var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"內(nèi)蒙古",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:"國外 "};5
6 //判斷身份證號是否18位
7 if(!/^\d{17}(\d|x)$/i.test(sId))8 return -1;9
10 //將身份證號的x替換成a
11 sId=sId.replace(/x$/i,"a");12
13 //判斷地區(qū)編號是否合法
14 if(aCity[parseInt(sId.substr(0,2))]==null)15 return -2; //return "Error:非法地區(qū)";
16
17 //判斷出生日期是否合法
18 var sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2)); //如:1986-07-15
19 var d=new Date(sBirthday.replace(/-/g,"/")); //如:1986/07/15
20 if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" +d.getDate()))21 return -3;//return "Error:非法生日";
22
23 //判斷最后一位校驗(yàn)碼是否正確
24 //身份證號的后四位的前三位是當(dāng)日出生的順序碼,奇為男,偶為女;
25 //最后一位是校驗(yàn)碼,由前17位數(shù)字乘以指定系數(shù)的結(jié)果相加,然后除以11,得到余數(shù),這余數(shù)對應(yīng)[1 0 X 9 8 7 6 5 4 3 2]中的數(shù)字。如余數(shù)是1,那么最終的校驗(yàn)碼就是0;余數(shù)是2,最終校驗(yàn)碼就是X
26 var iSum = 0;27 for(var i = 17;i>=0;i --)28 iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11);29 if(iSum%11!=1)30 return -4; //return "Error:非法證號";
31 birthday = ""+sId.substr(6,4)+Number(sId.substr(10,2))+Number(sId.substr(12,2));32 return ""+parseInt(sId.substr(0,2))+birthday+(sId.substr(16,1)%2?1:2); //"男":"女");
33 }
總結(jié)
以上是生活随笔為你收集整理的mysql校验规则居民身份证号_身份证号规则及校验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有关.jad文件
- 下一篇: java仿QQ2.0版(一直忘了更)