日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

java,javascript对18位身份证格式的验证算法

發(fā)布時(shí)間:2024/1/1 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java,javascript对18位身份证格式的验证算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
參考資料?
1 java實(shí)現(xiàn)的18位身份證格式驗(yàn)證算法?
http://fanqiang.chinaunix.net/program/java/2006-06-22/4639.shtml ?
原碼中有少許錯(cuò)誤,我已經(jīng)調(diào)整過來了?
2 身份證效驗(yàn)規(guī)則,經(jīng)典 ?
http://since2006.com/blog/176 ?
公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位數(shù)字校驗(yàn)碼組成.排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗(yàn)碼。?
1、地址碼?
表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按 GB/T 2260 的規(guī)定執(zhí)行。?
2、出生日期碼?
表示編碼對象出生的年、月、日,按 GB/T 7408 的規(guī)定執(zhí)行。年、月、日代碼之間不用分隔符。例:某人出生日期為 1966年10月26日,其出生日期碼為 19661026。?
3、順序碼?
表示在同一地址碼所標(biāo)識的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)千分配給女性。?
4 、校驗(yàn)碼?
根據(jù)前面十七位數(shù)字碼,按照ISO 7064:1983.MOD 11-2校驗(yàn)碼計(jì)算出來的檢驗(yàn)碼。由(1,2,3,4,5,6,7,8,9,X)構(gòu)成.?
(1)十七位數(shù)字本體碼加權(quán)求和公式?
  S = Sum(Ai * Wi), i = 0, ... , 16 ,先對前17位數(shù)字的權(quán)求和?
  Ai:表示第i位置上的身份證號碼數(shù)字值?
  Wi:表示第i位置上的加權(quán)因子?
  Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2?
(2)計(jì)算模?
  Y = mod(S, 11)?
(3)通過模得到對應(yīng)的校驗(yàn)碼?
    Y:   0 1 2 3 4 5 6 7 8 9 10?
    校驗(yàn)碼: 1 0 X 9 8 7 6 5 4 3 2?
下面舉例說明該計(jì)算方法并用代碼實(shí)現(xiàn)。?
公式:Ax=(∑(Ai×Wi))(mod 11)…………………………(1)?
i----表示身份證號碼字符從右至左包括校驗(yàn)碼在內(nèi)的位置序號;?
Ai----表示第i位置上的數(shù)字號碼;?
Ax----數(shù)字校驗(yàn)碼的值;?
Wi----示第i位置上的加權(quán)因子;?
公式:Wi=(2^(i-1))(mod 11)…………………………(2)?
設(shè)某男性公民身份號碼為51310119820113001,首先得到各個(gè)變量:?
??? i? 18? 17? 16? 15? 14? 13? 12? 11? 10?? 9?? 8?? 7?? 6?? 5?? 4?? 3?? 2?? 1?
由公式(2)可得:?
??? Wi? 7?? 9? 10?? 5?? 8?? 4?? 2?? 1?? 6?? 3?? 7?? 9? 10?? 5?? 8?? 4?? 2?? 1?
-------------------------------------------------------------------------------?
??? Ai? 5?? 1?? 3?? 1?? 0?? 1?? 1?? 9?? 8?? 2?? 0?? 1?? 1?? 3?? 0?? 0?? 1? Ax?
Ai×Wi 35?? 9? 30?? 5?? 0?? 4?? 2?? 9? 48?? 6?? 0?? 9? 10? 15?? 0?? 0?? 2? A1?
按照公式(1)計(jì)算:?
∑(Ai×Wi)=(35+9+30+5+0+4+2+9+48+6+0+9+10+15+0+0+2)=184?
184÷11=16+8/11?
∑(Ai×Wi)(mod 11)=8?
然后根據(jù)計(jì)算的結(jié)果,從下表中查出相應(yīng)的校驗(yàn)碼,X表示結(jié)果為10:?
∑(Ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10?
校驗(yàn)碼字符值A(chǔ)i???? 1 0 X 9 8 7 6 5 4 3 2?
根據(jù)上面的方法,查出計(jì)算結(jié)果為8的校驗(yàn)碼為4所以該人員的公民身份號碼應(yīng)該為513101198201130014
?
最新調(diào)整及修改: ?
參考資料?
1 JAVA代碼驗(yàn)證身份證信息?
http://www.blogjava.net/zeroline/archive/2011/01/03/342227.html ?
2 java身份證驗(yàn)證代碼類?
http://download.csdn.net/source/2967003 ?
特別說明,第一個(gè)鏈接上的源碼不是最新的,作者已經(jīng)上傳CSDN了?
見奉上ZeroLine的源碼
?
Java代碼??
  • import?java.util.Calendar;??
  • import?java.util.GregorianCalendar;??
  • import?java.util.HashMap;??
  • import?java.util.Map;??
  • ??
  • /**?
  • ?*?身份證驗(yàn)證的工具(支持5位或18位省份證)<br/>?
  • ?*?身份證號碼結(jié)構(gòu):?
  • ?*?<ol>?
  • ?*?<li>17位數(shù)字和1位校驗(yàn)碼:6位地址碼數(shù)字,8位生日數(shù)字,3位出生時(shí)間順序號,1位校驗(yàn)碼。</li>?
  • ?*?<li>地址碼(前6位):表示對象常住戶口所在縣(市、鎮(zhèn)、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。</li>??
  • ?*?<li>出生日期碼,(第七位?至十四位):表示編碼對象出生年、月、日,按GB按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。</li>??
  • ?*?<li>順序碼(第十五位至十七位):表示在同一地址碼所標(biāo)示的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編訂的順序號,?
  • ?*?順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。</li>???
  • ?*?<li>校驗(yàn)碼(第十八位數(shù)):<br/>???
  • ?*?<ul>?
  • ?*?<li>十七位數(shù)字本體碼加權(quán)求和公式?s?=?sum(Ai*Wi),?i?=?0,,16,先對前17位數(shù)字的權(quán)求和;????
  • ?*??Ai:表示第i位置上的身份證號碼數(shù)字值.Wi:表示第i位置上的加權(quán)因.Wi:?7?9?10?5?8?4?2?1?6?3?7?9?10?5?8?4?2;</li>?
  • ?*<li>計(jì)算模?Y?=?mod(S,?11)</li>??
  • ?*<li>通過模得到對應(yīng)的校驗(yàn)碼?Y:?0?1?2?3?4?5?6?7?8?9?10?校驗(yàn)碼:?1?0?X?9?8?7?6?5?4?3?2</li>???
  • ?*</ul>?
  • ?*</li>?
  • ?*</ol>?
  • ?*?
  • ?*@author?cxy?
  • ?*@since?2011-1-7?
  • ?*@see?{@link?http://www.blogjava.net/zeroline/archive/2011/01/03/342227.html}???
  • ?*/??
  • public?class?IdcardUtil?{??
  • ????final?static?Map<Integer,?String>?zoneNum?=?new?HashMap<Integer,?String>();??
  • ????static?{??
  • ????????zoneNum.put(11,?"北京");??
  • ????????zoneNum.put(12,?"天津");??
  • ????????zoneNum.put(13,?"河北");??
  • ????????zoneNum.put(14,?"山西");??
  • ????????zoneNum.put(15,?"內(nèi)蒙古");??
  • ????????zoneNum.put(21,?"遼寧");??
  • ????????zoneNum.put(22,?"吉林");??
  • ????????zoneNum.put(23,?"黑龍江");??
  • ????????zoneNum.put(31,?"上海");??
  • ????????zoneNum.put(32,?"江蘇");??
  • ????????zoneNum.put(33,?"浙江");??
  • ????????zoneNum.put(34,?"安徽");??
  • ????????zoneNum.put(35,?"福建");??
  • ????????zoneNum.put(36,?"江西");??
  • ????????zoneNum.put(37,?"山東");??
  • ????????zoneNum.put(41,?"河南");??
  • ????????zoneNum.put(42,?"湖北");??
  • ????????zoneNum.put(43,?"湖南");??
  • ????????zoneNum.put(44,?"廣東");??
  • ????????zoneNum.put(45,?"廣西");??
  • ????????zoneNum.put(46,?"海南");??
  • ????????zoneNum.put(50,?"重慶");??
  • ????????zoneNum.put(51,?"四川");??
  • ????????zoneNum.put(52,?"貴州");??
  • ????????zoneNum.put(53,?"云南");??
  • ????????zoneNum.put(54,?"西藏");??
  • ????????zoneNum.put(61,?"陜西");??
  • ????????zoneNum.put(62,?"甘肅");??
  • ????????zoneNum.put(63,?"青海");??
  • ????????zoneNum.put(64,?"新疆");??
  • ????????zoneNum.put(71,?"臺灣");??
  • ????????zoneNum.put(81,?"香港");??
  • ????????zoneNum.put(82,?"澳門");??
  • ????????zoneNum.put(91,?"外國");??
  • ????}??
  • ??????
  • ????final?static?int[]?PARITYBIT?=?{'1',?'0',?'X',?'9',?'8',?'7',?'6',?'5',?'4',?'3',?'2'};??
  • ????final?static?int[]?POWER_LIST?=?{?7,?9,?10,?5,?8,?4,?2,?1,?6,?3,?7,?9,?10,???
  • ????????5,?8,?4,?2};??
  • ??????
  • ????/**?
  • ?????*??
  • ?????*?身份證驗(yàn)證?
  • ?????*??
  • ?????*@param?s??
  • ?????*??????號碼內(nèi)容?
  • ?????*@return?是否有效?null和""?都是false??
  • ?????*/??
  • ????public?static?boolean?isIdcard(String?s){??
  • ????????if(s?==?null?||?(s.length()?!=?15?&&?s.length()?!=?18))??
  • ????????????return?false;??
  • ????????final?char[]?cs?=?s.toUpperCase().toCharArray();??
  • ????????//校驗(yàn)位數(shù)??
  • ????????int?power?=?0;??
  • ????????for(int?i=0;?i<cs.length;?i++){??
  • ????????????if(i==cs.length-1?&&?cs[i]?==?'X')??
  • ????????????????break;//最后一位可以?是X或x??
  • ????????????if(cs[i]<'0'?||?cs[i]>'9')??
  • ????????????????return?false;??
  • ????????????if(i?<?cs.length?-1){??
  • ????????????????power?+=?(cs[i]?-?'0')?*?POWER_LIST[i];??
  • ????????????}??
  • ????????}??
  • ??????????
  • ????????//校驗(yàn)區(qū)位碼??
  • ????????if(!zoneNum.containsKey(Integer.valueOf(s.substring(0,2)))){??
  • ????????????return?false;??
  • ????????}??
  • ??????????
  • ????????//校驗(yàn)?zāi)攴?/span>??
  • ????????String?year?=?s.length()?==?15???getIdcardCalendar()?+?s.substring(6,8)?:s.substring(6,?10);??
  • ??????????
  • ????????final?int?iyear?=?Integer.parseInt(year);??
  • ????????if(iyear?<?1900?||?iyear?>?Calendar.getInstance().get(Calendar.YEAR))??
  • ????????????return?false;//1900年的PASS,超過今年的PASS??
  • ??????????
  • ????????//校驗(yàn)月份??
  • ????????String?month?=?s.length()?==?15???s.substring(8,?10)?:?s.substring(10,12);??
  • ????????final?int?imonth?=?Integer.parseInt(month);??
  • ????????if(imonth?<1?||?imonth?>12){??
  • ????????????return?false;??
  • ????????}??
  • ??????????
  • ????????//校驗(yàn)天數(shù)????????
  • ????????String?day?=?s.length()?==15???s.substring(10,?12)?:?s.substring(12,?14);??
  • ????????final?int?iday?=?Integer.parseInt(day);??
  • ????????if(iday?<?1?||?iday?>?31)??
  • ????????????return?false;??
  • ??????????
  • ????????//校驗(yàn)一個(gè)合法的年月日:已經(jīng)得到校驗(yàn)了??
  • ????????/*if(!validate(iyear,?imonth,?iday))?
  • ????????????return?false;*/??
  • ??????????
  • ????????//校驗(yàn)"校驗(yàn)碼"??
  • ????????if(s.length()?==?15)??
  • ????????????return?true;??
  • ????????return?cs[cs.length?-1?]?==?PARITYBIT[power?%?11];??
  • ????}??
  • ??????
  • ????private?static?int?getIdcardCalendar()?{??????????
  • ?????????GregorianCalendar?curDay?=?new?GregorianCalendar();??
  • ?????????int?curYear?=?curDay.get(Calendar.YEAR);??
  • ?????????int?year2bit?=?Integer.parseInt(String.valueOf(curYear).substring(2));????????????
  • ?????????return??year2bit;??
  • ????}???????
  • ??????
  • ????@Deprecated??
  • ????static?boolean?validate(int?year,?int?imonth,?int?iday){??
  • ????????//比如考慮閏月,大小月等??
  • ????????return?true;??
  • ????}??
  • ??????
  • ????public?static?void?main(String[]?args)?{??
  • ??????
  • ?????????String?[]?idCard?=?{"124578457845784571","124578200402284571","510521195402201748","510522200402306644"};??
  • ?????????for(String?sfz?:?idCard){??
  • ?????????????System.out.println(isIdcard(sfz));???
  • ?????????}??
  • ????}??
  • }??


  • 經(jīng)過測試以下身份證驗(yàn)證不準(zhǔn)確,作個(gè)參考吧!如身份證號碼:124578457845784571 ?
    經(jīng)過調(diào)整后的源碼:?
    Java代碼??
  • public?class?IDCard?{??
  • ????//?wi?=2(n-1)(mod?11)??
  • ????final?int[]?wi?=?{?7,?9,?10,?5,?8,?4,?2,?1,?6,?3,?7,?9,?10,?5,?8,?4,?2,?1?};??
  • ??
  • ????//?verify?digit??
  • ????final?int[]?vi?=?{?1,?0,?'X',?9,?8,?7,?6,?5,?4,?3,?2?};??
  • ??
  • ????private?int[]?ai?=?new?int[18];??
  • ??
  • ????public?IDCard()?{??
  • ????}??
  • ??
  • ????//?verify??
  • ????public?boolean?Verify(String?idcard)?{??
  • ????????if?(idcard.length()?==?15)?{??
  • ????????????idcard?=?uptoeighteen(idcard);??
  • ????????}??
  • ????????if?(idcard.length()?!=?18)?{??
  • ????????????return?false;??
  • ????????}??
  • ????????String?verify?=?idcard.substring(17,?18);??
  • ????????if?(verify.equals(getVerify(idcard)))?{??
  • ????????????return?true;??
  • ????????}??
  • ????????return?false;??
  • ????}??
  • ??
  • ????//?get?verify??
  • ????public?String?getVerify(String?eightcardid)?{??
  • ????????int?remaining?=?0;??
  • ??
  • ????????if?(eightcardid.length()?==?18)?{??
  • ????????????eightcardid?=?eightcardid.substring(0,?17);??
  • ????????}??
  • ??
  • ????????if?(eightcardid.length()?==?17)?{??
  • ????????????int?sum?=?0;??
  • ????????????for?(int?i?=?0;?i?<?17;?i++)?{??
  • ????????????????String?k?=?eightcardid.substring(i,?i?+?1);??
  • ????????????????ai[i]?=?Integer.parseInt(k);??
  • ????????????}??
  • ??
  • ????????????for?(int?i?=?0;?i?<?17;?i++)?{??
  • ????????????????sum?=?sum?+?wi[i]?*?ai[i];??
  • ????????????}??
  • ????????????remaining?=?sum?%?11;??
  • ????????}??
  • ??
  • ????????return?remaining?==?2???"X"?:?String.valueOf(vi[remaining]);??
  • ????}??
  • ??
  • ????//?15?update?to?18??
  • ????public?String?uptoeighteen(String?fifteencardid)?{??
  • ????????String?eightcardid?=?fifteencardid.substring(0,?6);??
  • ????????eightcardid?=?eightcardid?+?"19";??
  • ????????eightcardid?=?eightcardid?+?fifteencardid.substring(6,?15);??
  • ????????eightcardid?=?eightcardid?+?getVerify(eightcardid);??
  • ????????return?eightcardid;??
  • ????}??
  • }??

  • 測試類?
    Java代碼??
  • IDCard?idcard?=?new?IDCard();???
  • System.out.println(idcard.Verify(sfz));??


  • 經(jīng)典驗(yàn)證類:?
    Java代碼??
  • public?class?IdCardDemo?{??
  • ??????
  • ????public?boolean?isIdCard(String?arrIdCard)?{??
  • ????????int?sigma?=?0;??
  • ????????Integer[]?a?=?{?7,?9,?10,?5,?8,?4,?2,?1,?6,?3,?7,?9,?10,?5,?8,?4,?2?};??
  • ????????String[]?w?=?{?"1",?"0",?"X",?"9",?"8",?"7",?"6",?"5",?"4",?"3",?"2"?};??
  • ????????for?(int?i?=?0;?i?<?17;?i++)?{??
  • ????????????int?ai?=?Integer.parseInt(arrIdCard.substring(i,?i?+?1));??
  • ????????????int?wi?=?a[i];??
  • ????????????sigma?+=?ai?*?wi;??
  • ????????}?????????
  • ????????int?number?=?sigma?%?11;??????????
  • ????????String?check_number?=?w[number];??????????
  • ????????if?(!arrIdCard.substring(17).equals(check_number))?{??
  • ????????????return?false;??
  • ????????}?else?{??
  • ????????????return?true;??
  • ????????}??
  • ????}??
  • }??

  • 相比第一個(gè)代碼量更少! ?推薦呀?

    經(jīng)過改寫后的javascript版本: ?
    Java代碼??
  • function?isIdCard(arrIdCard){??
  • ????????var?tag?=?false;??????
  • ????????var?sigma?=?0;????
  • ????????var?a?=?new?Array(7,?9,?10,?5,?8,?4,?2,?1,?6,?3,?7,?9,?10,?5,?8,?4,?2?);????
  • ????????var?w?=?new?Array("1",?"0",?"X",?"9",?"8",?"7",?"6",?"5",?"4",?"3",?"2");?????????
  • ????????for?(var?i?=?0;?i?<?17;?i++)?{????
  • ????????????var?ai?=?parseInt(arrIdCard.substring(i,?i?+?1));????
  • ????????????var?wi?=?a[i];????
  • ????????????sigma?+=?ai?*?wi;?????????????
  • ????????}?????
  • ????????var?number?=?sigma?%?11;??????????????
  • ????????var?check_number?=?w[number];?????
  • ????????if?(arrIdCard.substring(17)?!=?check_number)?{????
  • ????????????tag?=??false;????
  • ????????}?else?{????
  • ????????????tag?=?true;????
  • ????????}?????
  • ????????return?tag;??
  • }??

  • 經(jīng)過測試OK ?

    身份證15位轉(zhuǎn)換為18位,參考文章:15位身份證號碼轉(zhuǎn)18位的JSP程序?
    http://www.java3z.com/cwbwebhome/article/article5a/5105.jsp?id=7 ?
    Java版?
    Java代碼??
  • /**?
  • ?????*?身份證15位轉(zhuǎn)換18位?
  • ?????*?*/??
  • ????public?static?String?idCard15To18(String?ID15)?{??
  • ????????String?ID18?=?"";??
  • ????????if?(ID15.length()?==?18)?{??
  • ????????????ID18?=?ID15.toUpperCase();??
  • ????????}??
  • ????????if?(ID15.length()?==?15)?{??
  • ????????????int[]?w?=?{?7,?9,?10,?5,?8,?4,?2,?1,?6,?3,?7,?9,?10,?5,?8,?4,?2,?1?};??
  • ????????????char[]?A?=?{?'1',?'0',?'X',?'9',?'8',?'7',?'6',?'5',?'4',?'3',?'2'?};??
  • ????????????String?ID17?=?ID15.substring(0,?6)?+?"19"?+?ID15.substring(6,?15);??
  • ????????????int[]?ID17Array;??
  • ????????????ID17Array?=?new?int[17];??
  • ????????????for?(int?i?=?0;?i?<?17;?i++)?{??
  • ????????????????ID17Array[i]?=?Integer.parseInt(ID17.substring(i,?i?+?1));??
  • ????????????}??
  • ????????????int?s?=?0;??
  • ????????????for?(int?i?=?0;?i?<?17;?i++)?{??
  • ????????????????s?=?s?+?ID17Array[i]?*?w[i];??
  • ????????????}??
  • ????????????s?=?s?%?11;??
  • ????????????ID18?=?ID17?+?Character.toString(A[s]);??
  • ????????}??
  • ????????return?ID18;??
  • ????}??

  • JavaScrpt版本?
    Java代碼??
  • function?idCard15To18(id){??
  • ??var?W?=?new?Array(7,?9,?10,?5,?8,?4,?2,?1,?6,?3,?7,?9,?10,?5,?8,?4,?2,?1);??
  • ??var?A?=?new?Array("1",?"0",?"X",?"9",?"8",?"7",?"6",?"5",?"4",?"3",?"2");??
  • ??var?i,j,s=0;??
  • ??var?newid;??
  • ??newid?=?id;??
  • ??newid?=?newid.substring(0,6)+"19"+newid.substring(6,id.length);??
  • ??for(i=0;i<newid.length;i++?){??
  • ????j=?parseInt(newid.substring(i,i+1))*W[i];??
  • ????s=s+j;??
  • ??}??
  • ??s?=?s?%?11;??
  • ??newid=newid+A[s];???
  • ??return?newid;??
  • }??


  • 驗(yàn)證15,18身份證號碼的合法性?
    參考資料?
    1 js 驗(yàn)證 15位 、 18位 身份證?
    http://yanpinquan.blog.163.com/blog/static/281162892011510105435903/ ?
    2 用javascript驗(yàn)證身份證號碼15位或18位?
    http://topic.csdn.net/t/20050923/10/4288822.html ?
    Java代碼??
  • function???checkIDCard?(str)????
  • {???//身份證正則表達(dá)式(15位)????
  • ????isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;??
  • ????//身份證正則表達(dá)式(18位)??
  • ????isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;??
  • ??//驗(yàn)證身份證,返回結(jié)果????
  • ???return???(isIDCard1.test(str)||isIDCard2.test(str));??
  • ??}??

  • 這個(gè)方法不是很正確,正確的做法是:先將15轉(zhuǎn)換為18位,在調(diào)用方法驗(yàn)證是否正確 !

    總結(jié)

    以上是生活随笔為你收集整理的java,javascript对18位身份证格式的验证算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。