身份证准确性验证-加权因子

7个月前 1 0 1578

对于身份证验证的准确性,其实说白了就是对身份证最后一位校验码的验证。

验证校验码(第十八位数):

1.十七位数字本体码加权求和公式:

    S= SUM(Ai * Wi), i=0, ... , 16, 先对前17位数字的权求和;

    Ai:表示第i位置上的身份证号码数字值;

    Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(表示第i位置上的加权因子)

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 3 2


举例说明一下:

    身份证:32092519900410206X;

    S = 3*7 + 9*2 +10*0 + 9*5 + 2*8 +5*4 +1*1 + 6*9 + 9*3 + 0*3 + 0*7 + 4*9 + 1*10 + 0*5 +2*8 + 0*4 + 6*2 = 276;

    Y = mod(276,11) = 1; mod()结果是余数;

    由此可得出 X = 0;



身份证验证代码:

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;  
    }  
  
}

这只是单单的php验证代码,实际中会结合运用ajax来进行验证。

 

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

评论 (0)

    暂无评论~

njphper@copyright From 2014 to 2019-02-17