社會安全號碼碼的規則
1、15位社會安全號碼碼組成:
ddddddyymmddxxs共15位,其中:
dddddd為6位的地方代碼,根據這6位可以獲得該社會安全號碼所在地。
yy為2位的年份代碼,是身份證持有人的出身年份。
mm為2位的月份代碼,是身份證持有人的出身月份。
dd為2位的日期代碼,是身份證持有人的出身日。
這6位在一起組成了身份證持有人的出生日期。
xx為2位的順序碼,這個是隨機數。
s為1位的性別代碼,奇數代表男性,偶數代表女性。
2、18位社會安全號碼碼組成:
ddddddyyyymmddxxsp共18位,其中:
其他部分都和15位的相同。
年份代碼由原來的2位升級到4位。最後一位為校正位。
校正規則是:
1. 十七位元字本體碼加權求和公式
S = Sum(Ai * Wi), i = 0, ... , 16
,先對前17位元字的權求和
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)
3. 通過模得到對應的校正碼
Y: 0 1 2 3 4 5 6 7 8 9 10
校正碼: 1 0 X 9 8 7 6
5 4 3 2
比如得到餘數為1則最後的校正位p應該為對應的0.如果校正位不是,則該社會安全號碼碼不正確。
/**<br />* 驗證是不是數字<br />*/<br />function isNumber(oNum) {<br /> if(!oNum) return false;<br /> var strP=/^/d+(/./d+)?$/;<br /> if(!strP.test(oNum)) return false;<br /> try{<br /> if(parseFloat(oNum)!=oNum) return false;<br /> }<br /> catch(ex)<br /> {<br /> return false;<br /> }<br /> return true;<br />}<br />/**<br />*校正日期是否正確<br />*/<br />function isValidDate(iY, iM, iD) {<br /> if (iY>2200 || iY<1900 || !isNumber(iY)){<br /> alert("輸入社會安全號碼,年度"+iY+"非法!");<br /> return false;<br /> }<br /> if (iM>12 || iM<=0 || !isNumber(iM)){<br /> alert("輸入社會安全號碼,月份"+iM+"非法!");<br /> return false;<br /> }<br /> if (iD>31 || iD<=0 || !isNumber(iD)){<br /> alert("輸入社會安全號碼,日期"+iD+"非法!");<br /> return false;<br /> }<br /> return true;<br />}<br />/**<br />*判斷社會安全號碼碼格式函數<br />*公民身份號碼是特徵組合碼,<br />*排列順序從左至右依次為:六位元字地址碼,八位元字出生日期碼,三位元字順序碼和一位元字校正碼<br />*/<br />function isChinaIDCard(StrNo){<br /> StrNo = StrNo.toString();<br /> if(StrNo.length == 15){<br /> if(!isValidDate("19"+StrNo.substr(6,2),StrNo.substr(8,2),StrNo.substr(10,2))){<br /> return false;<br /> }<br /> }else if(StrNo.length == 18){<br /> if (!isValidDate(StrNo.substr(6,4),StrNo.substr(10,2),StrNo.substr(12,2))){<br /> return false;<br /> }<br /> }else{<br /> alert("輸入的社會安全號碼碼必須為15位或者18位!");<br /> return false;<br /> }</p><p> if (StrNo.length==18) {<br /> var a,b,c<br /> if (!isNumber(StrNo.substr(0,17))){<br /> alert("社會安全號碼碼錯誤,前17位不能含有英文字母!");<br /> return false;<br /> }<br /> a=parseInt(StrNo.substr(0,1))*7+parseInt(StrNo.substr(1,1))*9+parseInt(StrNo.substr(2,1))*10;<br /> a=a+parseInt(StrNo.substr(3,1))*5+parseInt(StrNo.substr(4,1))*8+parseInt(StrNo.substr(5,1))*4;<br /> a=a+parseInt(StrNo.substr(6,1))*2+parseInt(StrNo.substr(7,1))*1+parseInt(StrNo.substr(8,1))*6;<br /> a=a+parseInt(StrNo.substr(9,1))*3+parseInt(StrNo.substr(10,1))*7+parseInt(StrNo.substr(11,1))*9;<br /> a=a+parseInt(StrNo.substr(12,1))*10+parseInt(StrNo.substr(13,1))*5+parseInt(StrNo.substr(14,1))*8;<br /> a=a+parseInt(StrNo.substr(15,1))*4+parseInt(StrNo.substr(16,1))*2;<br /> b=a%11;<br /> if (b==2) { //最後一位為校正位<br /> c=StrNo.substr(17,1).toUpperCase(); //轉為大寫X<br /> }else{<br /> c=parseInt(StrNo.substr(17,1));<br /> }<br /> switch(b){<br /> case 0: if ( c!=1 ) {alert("身份證好號碼校正位錯:最後一位應該為:1");return false;}break;<br /> case 1: if ( c!=0 ) {alert("身份證好號碼校正位錯:最後一位應該為:0");return false;}break;<br /> case 2: if ( c!="X") {alert("身份證好號碼校正位錯:最後一位應該為:X");return false;}break;<br /> case 3: if ( c!=9 ) {alert("身份證好號碼校正位錯:最後一位應該為:9");return false;}break;<br /> case 4: if ( c!=8 ) {alert("身份證好號碼校正位錯:最後一位應該為:8");return false;}break;<br /> case 5: if ( c!=7 ) {alert("身份證好號碼校正位錯:最後一位應該為:7");return false;}break;<br /> case 6: if ( c!=6 ) {alert("身份證好號碼校正位錯:最後一位應該為:6");return false;}break;<br /> case 7: if ( c!=5 ) {alert("身份證好號碼校正位錯:最後一位應該為:5");return false;}break;<br /> case 8: if ( c!=4 ) {alert("身份證好號碼校正位錯:最後一位應該為:4");return false;}break;<br /> case 9: if ( c!=3 ) {alert("身份證好號碼校正位錯:最後一位應該為:3");return false;}break;<br /> case 10: if ( c!=2 ){alert("身份證好號碼校正位錯:最後一位應該為:2");return false;}<br /> }<br /> }else {//15位社會安全號碼<br /> if (!isNumber(StrNo)) {<br /> alert("社會安全號碼碼錯誤,前15位不能含有英文字母!");<br /> return false;<br /> }<br /> }<br /> return true;<br />}