php認証身分証明書番号


身分証明書番号の構成
身分証明書番号は、17ビットのデジタルボリュームコードと1ビットの検証コードからなる特徴的な組合せコードである.
配列順序は左から右に、6桁のデジタルアドレスコード、8桁のデジタル生年月日コード、3桁のデジタル順序コード、および1桁のデジタル検証コードである.
アドレスコード(上位6桁)
コードの対象を示す常住戸籍の所在県(市、旗、区)の行政区画コードは、GB/T 2260の規定に従って実行される.
生年月日コード(7位から14位)
符号化対象が生まれた年、月、日を表し、GB/T 7408の規定に従って実行し、年、月、日コードの間に区切り記号を使わない.
シーヶンスコード(15~17ビット)
同じアドレスコードに表示されるエリア範囲で、同年、同月、同日生まれの人に対して編成された順番番号を示し、順番コード奇数は男性に、偶数は女性に割り当てられる.
チェツクコード(18桁目)
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 2
認証方法:
<?php
function checkIdCard($idcard){

    //    18 
    if(strlen($idcard)!=18){
        return false;
    }

    //      
    $idcard_base = substr($idcard, 0, 17);

    //      
    $verify_code = substr($idcard, 17, 1);

    //     
    $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

    //       
    $verify_code_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

    //    17      
    $total = 0;
    for($i=0; $i<17; $i++){
        $total += substr($idcard_base, $i, 1)*$factor[$i];
    }

    //   
    $mod = $total % 11;

    //      
    if($verify_code == $verify_code_list[$mod]){
        return true;
    }else{
        return false;
    }

}


$idcard = '             ';
var_dump(checkIdCard($idcard));
?>