身份證校驗原理和PHP實現


原文地址:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21126994&id=3938244
關於身份證的校驗算法問題
身份證15位升級到18位,原來年用2位且沒有最后一位,從左到右方分別表示
①1-2 升級行政區代碼
②3-4 地級行政區划分代碼
③5-6 縣區行政區分代碼
④7-10 11-12 13-14 出生年、月、日
⑤15-17 順序碼,同一地區同年、同月、同日出生人的編號,奇數是男性,偶數是女性
⑥18 校驗碼,如果是0-9則用0-9表示,如果是10則用X(羅馬數字10)表示
ISO 7064:1983.MOD 11-2校驗碼
  ∑(a[i]*W[i])  mod 11 ( i = 18,17,16 ... 2 ) 最后一位是校驗位 1 
 
  "*" 表示乘號
  i--------表示身份證號碼每一位的序號,從右至左,最左側為18,最右側為1。
  a[i]-----表示身份證號碼第 i 位上的號碼
  W[i]-----表示第 i 位上的權值 W[i] = 2^(i-1) mod 11  【這里得到的序列是 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2】
  計算公式 (1) 令結果為 R
 
  根據下表找出 R 對應的校驗碼即為要求身份證號碼的校驗碼C。
  R 0 1 2 3 4 5 6 7 8 9 10
  C 1 0 X 9 8 7 6 5 4 3 2
  由此看出 X 就是 10,羅馬數字中的 10 就是 X

1、將前面的身份證號碼17位數分別乘以不同的系數。第i位對應的數為[2^(18-i)]mod11。從第一位到第十七位的系數分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
2、將這17位數字和系數相乘的結果相加;
3、用加出來和除以11,看余數是多少?;
4、余數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字。其分別對應的最后一位身份證的號碼為1 0 X 9 8 7 6 5 4 3 2;
5、通過上面得知如果余數是2,就會在身份證的第18位數字上出現羅馬數字的Ⅹ。如果余數是10,身份證的最后一位號碼就是2;

下面是我自己寫的一個簡單的PHP實現的過程:

    <?php
    /**
    * 輸入 id 號碼 然后檢驗是否合適
    **/
    function checkId($id) {
        $len = strlen($id);
        if($len != 18) {
            return 0;
        }
        $a=str_split($id,1);
        $w=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
        $c=array(1,0,'X',9,8,7,6,5,4,3,2);
        $sum = 0;
        for($i=0;$i<17;$i++){
                $sum= $sum + $a[$i]*$w[$i];
        }
        $r=$sum%11;
        $res=$c[$r];
        //echo "校驗位是: ".$res;
        if ($res == $a[17]) {
            return 1;
        } else {
            return 0;
        }
    }

 

使用Excel進行校驗計算的模型,假設號碼在A1單元格的內部,則在計算欄里面輸入如下的公式即可計算:


  1. =LOOKUP(MOD(MID($A$1,1,1)*MOD(2^17,11)+MID($A$1,2,1)*MOD(2^16,11)+MID($A$1,3,1)*MOD(2^15,11)+MID($A$1,4,1)*MOD(2^14,11)+MID($A$1,5,1)*MOD(2^13,11)+MID($A$1,6,1)*MOD(2^12,11)+MID($A$1,7,1)*MOD(2^11,11)+MID($A$1,8,1)*MOD(2^10,11)+MID($A$1,9,1)*MOD(2^9,11)+MID($A$1,10,1)*MOD(2^8,11)+MID($A$1,11,1)*MOD(2^7,11)+MID($A$1,12,1)*MOD(2^6,11)+MID($A$1,13,1)*MOD(2^5,11)+MID($A$1,14,1)*MOD(2^4,11)+MID($A$1,15,1)*MOD(2^3,11)+MID($A$1,16,1)*MOD(2^2,11)+MID($A$1,17,1)*MOD(2^1,11),11),{0;1;2;3;4;5;6;7;8;9;10},{1;0;"X";9;8;7;6;5;4;3;2})
下面這個圖則是對身份證進行校驗計算的模型:



下面是國家發布的GB文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM