18位身分證號碼各位的意義
1-2位省、自治區、直轄市代碼;
3-4位地級市、盟、自治州代碼;
5-6位縣、縣級市、區代碼;
7-14位出生年月日,如19670401代表1967年4月1日;
15-17位為順序號,其中17位男為單數,女為雙數;
18位元為校驗碼,0-9和X,由公式隨機產生;
舉例:
340523 1980 0101 0013這個身分證字號的意思:
34為安徽省
05為馬鞍山市
23為和縣
19800101為出生日期(1980年1月1日)
001為順序號(1為單數,代表為男性)
3為驗證碼
行政區劃代碼
最新縣及縣以上行政區劃代碼(截止2014年10月31日)
北京市 (110000 BJ)
天津市 (120000 TJ)
河北省 (130000 HE)
山西省 (140000 SX)
內蒙古自治區 (150000 NM)
遼寧省 (210000 LN)
吉林省 (220000 JL)
黑龍江省 (230000 HL)
上海市 (310000 SH)
江蘇省 (320000 JS)
浙江省 (330000 ZJ)
安徽省 (340000 AH)
福建省 (350000 FJ)
江西省 (360000 JX)
山東省 (370000 SD)
河南省 (410000 HA)
湖北省 (420000 HB)
湖南省 (430000 HN)
廣東省 (440000 GD)
廣西壯族自治區 (450000 GX)
海南省 (460000 HI)
重慶市 (500000 CQ)
四川省 (510000 SC)
貴州省 (520000 GZ)
雲南省 (530000 YN)
西藏自治區 (540000 XZ)
陝西省 (610000 SN)
甘肅省 (620000 GS)
青海省 (630000 QH)
寧夏回族自治區 (640000 NX)
新疆維吾爾自治區 (650000 XJ)
台灣省 (710000 Tw)
香港特別行政區 (810000 HK)
澳門特別行政區 (820000 Mo)
身分證第18位(校驗碼)的計算方法
將身分證號碼前面的17位數分別乘以不同的係數;
由第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
將這17位數和係數相乘的結果相加;
用加出來和除以11,看餘數是多少;
餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字;
其分別對應的最後一位身分證的號碼為1-0-X-9-8-7-6-5-4-3-2
透過上面得知如果餘數是2,就會在身分證的第18位數上出現羅馬數字的Ⅹ。如果餘數是10,則身分證的最後一位號碼就是2。
舉例:
某男性的身分證號碼是340523198001010013。我們要看看這個身分證是不是合法的身分證。
首先我們得到前17位的積和:
(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0 *10+1*5+0*8+0*4+1*2) = 185
然後再求餘:
185 % 11 = 9
最後透過對應規則就可以知道餘數9對應的數字是3。所以,可以判定這是一個合格的身分證號碼。
JavaScript校驗18位元身分證
首先校驗位數是否為18位:
if(!/^\d{17}(\d|x)$/i.test(ID)) return false; // \d 匹配数字 // ^ 匹配开始 // $ 匹配结尾 // i 不区分大小写 // {17} 匹配17次 // \d|x 匹配数字或x
然後校驗開頭兩位是否是合法的省(直轄市/自治區):
if(city[ID.substr(0,2)] === undefined) return "非法地区";
// stringObject.substr(start,length) 方法可在字串中抽取從 start 下標開始的指定數目的字元
// 存取物件屬性時除了可以用點(.)語法外,也可以用中括號([]),用中括號時更靈活
然後再校驗出生日期是否合法:
var birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2)); var d = new Date(birthday); var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate()); var currentTime = new Date().getTime(); var time = d.getTime(); if(time >= currentTime || birthday !== newBirthday) return '非法生日'; // 获取身份证的年月日,然后再 new 一个 Date,再对比这两个日期是否一致 // 这里用Number()主要是因为身份证的日期是带0的,而new Date()出来的日期是不带0的,Number()之后就都不带0了
最後判斷校驗碼是否正確:
var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; var sum = 0, i, residue; for(i=0; i<17; i++) { sum += ID.substr(i, 1) * arrInt[i]; } residue = arrCh[sum % 11]; if (residue !== ID.substr(17, 1)) '非法证号';
如果以上校驗都通過了,則是一個合法的身份證號;
完整程式碼
<script> function checkID(ID) { if(typeof ID !== 'string') return '非法字符串'; var city = {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 birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2)); var d = new Date(birthday); var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate()); var currentTime = new Date().getTime(); var time = d.getTime(); var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; var sum = 0, i, residue; if(!/^\d{17}(\d|x)$/i.test(ID)) return '非法身份证'; if(city[ID.substr(0,2)] === undefined) return "非法地区"; if(time >= currentTime || birthday !== newBirthday) return '非法生日'; for(i=0; i<17; i++) { sum += ID.substr(i, 1) * arrInt[i]; } residue = arrCh[sum % 11]; if (residue !== ID.substr(17, 1)) return '非法身份证哦'; return city[ID.substr(0,2)]+","+birthday+","+(ID.substr(16,1)%2?" 男":"女") } </script>