posts - 33,  comments - 17,  trackbacks - 0
          現(xiàn)在的居民身份證由原先的15位號(hào)碼升級(jí)為18位了。從左至右,第1-2位為省級(jí)行政區(qū)劃代碼,第3-4為為地級(jí)行政區(qū)劃代碼,第5-6位為縣級(jí)行政區(qū)劃代碼,第7-10位為出生年份,第11-12位為出生月份,第13-14為出生日期,第15-17位為順序碼,表示在同一地址碼所標(biāo)識(shí)的區(qū)域范圍內(nèi),對(duì)同年、同月、同日出生的人編定的順序號(hào),順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性,第18位為作為尾號(hào)的校驗(yàn)碼,是由號(hào)碼編制單位按統(tǒng)一的公式計(jì)算出來(lái)的,如果某人的尾號(hào)是0-9,都不會(huì)出現(xiàn)X,但如果尾號(hào)是10,那么就得用X來(lái)代替,因?yàn)槿绻?0做尾號(hào),那么此人的身份證就變成了19位。X是羅馬數(shù)字的10,用X來(lái)代替10,可以保證公民的身份證符合國(guó)家標(biāo)準(zhǔn)。

          根據(jù)《中華人民共和國(guó)國(guó)家標(biāo)準(zhǔn)GB 11643-1999》中有關(guān)公民身份號(hào)碼的規(guī)定,公民身份號(hào)碼是特征組合碼,由十七位數(shù)字本體碼和一位數(shù)字校驗(yàn)碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗(yàn)碼。順序碼的奇數(shù)分給男性,偶數(shù)分給女性。校驗(yàn)碼是根據(jù)前面十七位數(shù)字碼,按照ISO 7064:1983.MOD 11-2校驗(yàn)碼計(jì)算出來(lái)的檢驗(yàn)碼。

          下面介紹算法。
          先引入公式:
          uploads/200709/21_204230_1.jpg
          uploads/200709/21_204643_1.jpg


          計(jì)算公式令結(jié)果為 Y,Y的計(jì)算公式為:Y = mod(S, 11)根據(jù)下表找出 Y 對(duì)應(yīng)的校驗(yàn)碼即為要求身份證號(hào)碼的校驗(yàn)碼C。
          uploads/200709/21_205116_1.jpg


          例如:假設(shè)某女性居民的15位身份證號(hào)碼是320105820927512,32表示江蘇省,01表示南京市,05表示鼓樓區(qū),820927表示1982年9月27日。512表示是該地區(qū)同年同月同日的第512人,其中2表示是女性。那么,升級(jí)為18位后的號(hào)碼為32010519820927512C。下面就根據(jù)公式來(lái)計(jì)算C的值。
          uploads/200709/21_214620_1.jpg

          Y = mod(S, 11)=MOD(313,11)=5
          根據(jù)校驗(yàn)值對(duì)應(yīng)表,可知C=7,該人員身份證號(hào)碼為:320105198209275127

          又如:某男性公民身份證號(hào)碼的本體碼為34052419800101001
          uploads/200709/21_213847_1.jpg
          Y = mod(S, 11)=MOD(189,11)=2
          查表得該人員身份證號(hào)碼為:34052419800101001X

          具體實(shí)現(xiàn)代碼如下(JAVA):
           1public boolean isIdCard(String arrIdCard) {
           2        int sigma = 0;
           3        Integer[] a = {7910584216379105842};
           4        String[] w = {"1""0""X""9""8""7""6""5""4""3""2"};
           5        for (int i=0; i<17; i++{
           6            int ai = Integer.parseInt(arrIdCard.substring(i,i+1));
           7            int wi = a[i];
           8            sigma += ai * wi;
           9        }

          10        int number = sigma % 11;
          11        String check_number = w[number];
          12        //return check_number;
          13        //System.out.println(check_number);
          14        if (!arrIdCard.substring(17).equals(check_number)) {
          15            return false;
          16        }
           else {
          17            return true;
          18        }

          19    }

          posted on 2008-05-28 19:48 scea2009 閱讀(25083) 評(píng)論(10)  編輯  收藏

          FeedBack:
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式
          2011-07-24 11:06 | call mepro
          320105198209275127 成年了?
            回復(fù)  更多評(píng)論
            
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式
          2011-08-12 16:47 | 阿斯頓撒
          @call mepro
          都40歲了好么  回復(fù)  更多評(píng)論
            
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式
          2011-08-31 20:52 | 譚芳香
          # ISO 7064:1983.MOD 11-2
          2012-10-02 09:33 | 張策
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式
          2013-05-04 02:10 | 邱麗娟
          35078419861128420  回復(fù)  更多評(píng)論
            
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式
          2013-05-04 02:11 | 邱麗娟
          邱麗娟  回復(fù)  更多評(píng)論
            
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式
          2013-05-04 02:12 | 邱麗娟
          1public boolean isIdCard(String arrIdCard) {
          2 int sigma = 0;
          3 Integer[] a = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
          4 String[] w = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
          5 for (int i=0; i<17; i++) {
          6 int ai = Integer.parseInt(arrIdCard.substring(i,i+1));
          7 int wi = a[i];
          8 sigma += ai * wi;
          9 }
          10 int number = sigma % 11;
          11 String check_number = w[number];
          12 //return check_number;
          13 //System.out.println(check_number);
          14 if (!arrIdCard.substring(17).equals(check_number)) {
          15 return false;
          16 } else {
          17 return true;
          18 }
          19 }
            回復(fù)  更多評(píng)論
            
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式
          2013-06-15 15:28 | lixziyu
          wozhidao  回復(fù)  更多評(píng)論
            
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式
          2013-07-30 12:14 | 陸樹軍
          340621198706139338  回復(fù)  更多評(píng)論
            
          # re: 18位號(hào)碼身份證校驗(yàn)碼的計(jì)算公式[未登錄]
          2014-01-08 23:17 | 李杰
          1@邱麗娟
            回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          <2014年1月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          PL/SQL存儲(chǔ)過(guò)程與函數(shù)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 嘉义市| 衢州市| 阿坝县| 远安县| 中山市| 瑞昌市| 鹤庆县| 报价| 泸溪县| 岱山县| 中牟县| 江达县| 榕江县| 精河县| 昌平区| 武功县| 永昌县| 自贡市| 呼图壁县| 牙克石市| 宝兴县| 兖州市| 茌平县| 当涂县| 财经| 仪陇县| 高阳县| 澄江县| 霍山县| 井研县| 青河县| 神农架林区| 双桥区| 顺义区| 白城市| 禹州市| 巫溪县| 昆明市| 会理县| 浠水县| 衡阳市|