身份证号末尾算法(附源代码)


我之前是玩网赚的,经常遇到一个问题,软件要求输入身份证号,随便输会报错,并且抓包没有任何数据,也就是说软件是在本地进行的判断,这就让我产生了很大的兴趣(末尾有在线工具)

身份证的组成

想了解算法就要先了解组成
身份证=六位地址码+八位数字生日+三位顺序码+一位校验码
最后以为检验码就是前17位通过算法生成的数字

身份证检验码算法

最后一位的检验方法是这样的

  1. 身份证前17位 * 对应加权因子(加权因子:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2)
  2. 结果除以11得出余数
  3. 根据余数查找相应的校验码(顺序为:1 0 X 9 8 7 6 5 4 3 2)

假如某人身份证前17位是12345678901234567,则最后一位的式子是:

(1*7+2*9+3*10+4*5+5*8+6*4+7*2+8*1+9*6+0*3+1*7+2*9+3*10+4*5+5*8+6*4+7*2)%11

这个式子的余数是5,因为算法与程序中都是从0开始数的,所以对应的第六个数字就是检验码,位7
所以最终的身份证号位123456789012345677

程序代码

JavaScript代码

<script>
function calc(str){
    var coeff = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1];
    var suffix = ['1','0','x','9','8','7','6','5','4','3','2'];
    var sum = 0;
    for(var i=0;i<17;i++)
    sum += coeff[i] * parseInt(str.charCodeAt(i)-48);
    sum %= 11;
    str = str.substr(0,17) + suffix[sum];
    return str;
}
</script>
<button onclick="alert(calc(prompt(&#39;请输入待计算的身份证号(前17位)&#39;)))">立即计算</button>

php代码

function ckeckIdCard($id){
    static $codeArr = array(1,0,'X',9,8,7,6,5,4,3,2);
    $keyArr = array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
    $id = strtoupper($id);
    if(!preg_match('/^[\d]{17}[\dX]{1}$/', $id)) return false;
    $num = 0;
    for($i=0; $i<17; $i++){
        $num += $id[$i] * $keyArr[$i];
    }
    $key = $num % 11;
    return substr($id, -1) == $codeArr[$key];
}

C语言

#include <stdio.h>

/**
* 身份证验证算法
*/

int main(int argc, char const *argv[]) {

 //获得校验码
 char getValidateCode(char *idcard);

 //验证身份证
 int getValidateResult(char * idcard,char validateCode);

 //存储身份证号码
 char * idcard="122222190904057081";

 char code = getValidateCode(idcard);
 int result = getValidateResult(idcard,code);

 printf("validatecode is %c\n",code);

 if(result==1){
 printf("身份证号码正确\n");
 }
 else {
 printf("身份证号码不正确\n");
 }

 return 0;
}

/**
* 获取身份证校验码(最后一位)
*/
char getValidateCode(char *idcard){

 int weight[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

 char validate[11] = {'1','0','X','9','8','7','6','5','4','3','2'};

 int i,sum=0,mode;

 for(i=0;i<17;i++){
 sum = sum + (idcard[i] - '0') * weight[i];
 }

 //计算模
 mode = sum%11;

 return validate[mode];
}

//得到验证结果 0不正确 1正确
int getValidateResult(char * idcard,char validateCode){
 int result = 0;
 if(idcard[17]==validateCode){
 result = 1;
 }
 return result;
}

声明:文生技术博客|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 身份证号末尾算法(附源代码)


做个俗人,贪财好色。