zoukankan      html  css  js  c++  java
  • 精准身份证号验证的具体实现方法 校验码计算逻辑

    身份证号分为两种,旧的为15位,新的为18位。

    身份证15位编码规则:dddddd yymmdd xx p   

    其中 dddddd:地区码    yymmdd: 出生年月日    xx: 顺序类编码,无法确定    p: 性别,奇数为男,偶数为女;

    身份证18位编码规则:dddddd yyyymmdd xxx y   

    其中 dddddd:地区码    yyyymmdd: 出生年月日     xxx:顺序类编码,无法确定,奇数为男,偶数为女    y: 校验码,该位数值可通过前17位计算获得,计算的公式见程序,一些需要用到的常数

    18位号码加权因子为(从右到左)Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]    验证位Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]    校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )    

    i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置。

    var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 
    var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];   // 身份证验证位值.10代表X 
    function IdCardValidate(idCard) { 
     idCard = trim(idCard.replace(/ /g, ""));    //去掉字符串头尾空格      
     if (idCard.length == 15) { 
      return isValidityBrithBy15IdCard(idCard);  //进行15位身份证的验证 
     } else if (idCard.length == 18) { 
      var a_idCard = idCard.split("");    // 得到身份证数组 
      if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){ //进行18位身份证的基本验证和第18位的验证
       return true; 
      }else { 
       return false; 
      } 
     } else { 
      return false; 
     } 
    } 
    /** 
     * 判断身份证号码为18位时最后的验证位是否正确 
     * @param a_idCard 身份证号码数组 
     * @return 
     */ 
    function isTrueValidateCodeBy18IdCard(a_idCard) { 
     var sum = 0;        // 声明加权求和变量 
     if (a_idCard[17].toLowerCase() == 'x') { 
      a_idCard[17] = 10;     // 将最后位为x的验证码替换为10方便后续操作 
     } 
     for ( var i = 0; i < 17; i++) { 
      sum += Wi[i] * a_idCard[i];   // 加权求和 
     } 
     valCodePosition = sum % 11;    // 得到验证码所位置 
     if (a_idCard[17] == ValideCode[valCodePosition]) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
    /** 
     * 验证18位数身份证号码中的生日是否是有效生日 
     * @param idCard 18位书身份证字符串 
     * @return 
     */ 
    function isValidityBrithBy18IdCard(idCard18){ 
     var year = idCard18.substring(6,10); 
     var month = idCard18.substring(10,12); 
     var day = idCard18.substring(12,14); 
     var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
     // 这里用getFullYear()获取年份,避免千年虫问题 
     if(temp_date.getFullYear()!=parseFloat(year) 
       ||temp_date.getMonth()!=parseFloat(month)-1 
       ||temp_date.getDate()!=parseFloat(day)){ 
       return false; 
     }else{ 
      return true; 
     } 
    } 
     /** 
     * 验证15位数身份证号码中的生日是否是有效生日 
     * @param idCard15 15位书身份证字符串 
     * @return 
     */ 
     function isValidityBrithBy15IdCard(idCard15){ 
      var year = idCard15.substring(6,8); 
      var month = idCard15.substring(8,10); 
      var day = idCard15.substring(10,12); 
      var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
      // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 
      if(temp_date.getYear()!=parseFloat(year) 
        ||temp_date.getMonth()!=parseFloat(month)-1 
        ||temp_date.getDate()!=parseFloat(day)){ 
        return false; 
      }else{ 
       return true; 
      } 
     } 
    //去掉字符串头尾空格 
    function trim(str) { 
     return str.replace(/(^s*)|(s*$)/g, ""); 
    } 

     根据身份证号对其进行性别的判定

    /** 
     * 通过身份证判断是男是女 
     * @param idCard 15/18位身份证号码 
     * @return 'female'-女、'male'-男 
     */ 
    function maleOrFemalByIdCard(idCard){ 
     idCard = trim(idCard.replace(/ /g, ""));  // 对身份证号码做处理。包括字符间有空格。 
     if(idCard.length==15){ 
      if(idCard.substring(14,15)%2==0){ 
       return 'female'; 
      }else{ 
       return 'male'; 
      } 
     }else if(idCard.length ==18){ 
      if(idCard.substring(14,17)%2==0){ 
       return 'female'; 
      }else{ 
       return 'male'; 
      } 
     }else{ 
      return null; 
     } 
    } 

    以上就是javascript验证身份证号的具体实现方法,并且根据身份证能验证性别

    以下是根据身份证号码编码规则,使用JS对其进行有效性验证代码

    IdCard-Validate.js代码如下: 

    代码如下:

    /**
     * 身份证15位编码规则:dddddd yymmdd xx p 
     * dddddd:地区码 
     * yymmdd: 出生年月日 
     * xx: 顺序类编码,无法确定 
     * p: 性别,奇数为男,偶数为女
     * <p />
     * 身份证18位编码规则:dddddd yyyymmdd xxx y 
     * dddddd:地区码 
     * yyyymmdd: 出生年月日 
     * xxx:顺序类编码,无法确定,奇数为男,偶数为女 
     * y: 校验码,该位数值可通过前17位计算获得
     * <p />
     * 18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]
     * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ] 
     * 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 ) 
     * i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置
     * 
     */
    
    
    
    var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];// 加权因子
    var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];// 身份证验证位值.10代表X
    function IdCardValidate(idCard) {
     idCard = trim(idCard.replace(/ /g, ""));
     if (idCard.length == 15) {
      return isValidityBrithBy15IdCard(idCard);
     } else if (idCard.length == 18) {
      var a_idCard = idCard.split("");// 得到身份证数组
      if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){
       return true;
      }else {
       return false;
      }
     } else {
      return false;
     }
    }
    /**
     * 判断身份证号码为18位时最后的验证位是否正确
     * @param a_idCard 身份证号码数组
     * @return
     */
    function isTrueValidateCodeBy18IdCard(a_idCard) {
     var sum = 0; // 声明加权求和变量
     if (a_idCard[17].toLowerCase() == 'x') {
      a_idCard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作
     }
     for ( var i = 0; i < 17; i++) {
      sum += Wi[i] * a_idCard[i];// 加权求和
     }
     valCodePosition = sum % 11;// 得到验证码所位置
     if (a_idCard[17] == ValideCode[valCodePosition]) {
      return true;
     } else {
      return false;
     }
    }
    /**
     * 通过身份证判断是男是女
     * @param idCard 15/18位身份证号码 
     * @return 'female'-女、'male'-男
     */
    function maleOrFemalByIdCard(idCard){
     idCard = trim(idCard.replace(/ /g, ""));// 对身份证号码做处理。包括字符间有空格。
     if(idCard.length==15){
      if(idCard.substring(14,15)%2==0){
       return 'female';
      }else{
       return 'male';
      }
     }else if(idCard.length ==18){
      if(idCard.substring(14,17)%2==0){
       return 'female';
      }else{
       return 'male';
      }
     }else{
      return null;
     }
    // 可对传入字符直接当作数组来处理
    // if(idCard.length==15){
    // alert(idCard[13]);
    // if(idCard[13]%2==0){
    // return 'female';
    // }else{
    // return 'male';
    // }
    // }else if(idCard.length==18){
    // alert(idCard[16]);
    // if(idCard[16]%2==0){
    // return 'female';
    // }else{
    // return 'male';
    // }
    // }else{
    // return null;
    // }
    }
     /**
      * 验证18位数身份证号码中的生日是否是有效生日
      * @param idCard 18位书身份证字符串
      * @return
      */
    function isValidityBrithBy18IdCard(idCard18){
     var year =  idCard18.substring(6,10);
     var month = idCard18.substring(10,12);
     var day = idCard18.substring(12,14);
     var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));
     // 这里用getFullYear()获取年份,避免千年虫问题
     if(temp_date.getFullYear()!=parseFloat(year)
           ||temp_date.getMonth()!=parseFloat(month)-1
           ||temp_date.getDate()!=parseFloat(day)){
            return false;
     }else{
      return true;
     }
    }
      /**
       * 验证15位数身份证号码中的生日是否是有效生日
       * @param idCard15 15位书身份证字符串
       * @return
       */
      function isValidityBrithBy15IdCard(idCard15){
       var year =  idCard15.substring(6,8);
       var month = idCard15.substring(8,10);
       var day = idCard15.substring(10,12);
       var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));
       // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
       if(temp_date.getYear()!=parseFloat(year)
            ||temp_date.getMonth()!=parseFloat(month)-1
            ||temp_date.getDate()!=parseFloat(day)){
             return false;
      }else{
       return true;
      }
      }
    //去掉字符串头尾空格
    function trim(str) {
     return str.replace(/(^/s*)|(/s*$)/g, "");
    }
  • 相关阅读:
    Vim Taglist插件的安装与配置
    static变量和static函数
    Linux线程同步读写锁 rwlock
    Linux top命令 使用详解
    Python学习资料
    记录点滴
    自定义的动态buffer
    【数据存储】【Redis】第七章:Redis缓存Zset类型的使用
    RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
    RabbitMQ:第三章:Springboot集成RabbitMQ(直连模式,工作队列模式,发布订阅模式,路由模式,通配符模式)
  • 原文地址:https://www.cnblogs.com/candlia/p/11919891.html
Copyright © 2011-2022 走看看