后台身份证验证算法

 /**
     * 计算身份证校验码,根据国家标准GB 11643-1999
    *
     *
     * @param [type] $idcard_base
     * @return void
     */
    public static function idcard_verify_number($idcard_base){

        if (strlen($idcard_base) != 17){ return false; }
        // 加权因子
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

        // 校验码对应值
        $verify_number_list = array(‘1‘, ‘0‘, ‘X‘, ‘9‘, ‘8‘, ‘7‘, ‘6‘, ‘5‘, ‘4‘, ‘3‘, ‘2‘);

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

        $mod = strtoupper($checksum % 11);
        $verify_number = $verify_number_list[$mod];

        return $verify_number;

    }

    /**
     * 将15位身份证升级到18位
     *
     * @param [type] $idcard
     * @return void
     */
    public static function idcard_15to18($idcard){

        if (strlen($idcard) != 15){
            return false;
        }else{
            // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
            if (array_search(substr($idcard, 12, 3), array(‘996‘, ‘997‘, ‘998‘, ‘999‘)) !== false){
                $idcard = substr($idcard, 0, 6) . ‘18‘. substr($idcard, 6, 9);
            }else{
                $idcard = substr($idcard, 0, 6) . ‘19‘. substr($idcard, 6, 9);
            }
        }

        $idcard = $idcard . self::idcard_verify_number($idcard);

        return $idcard;

    }

    /**
     * 18位身份证校验码有效性检查
     *
     * @param [type] $idcard
     * @return void
     */
    public static function idcard_checksum18($idcard){

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

        $aCity = array(11 => "北京",12=>"天津",13=>"河北",14=>"山西",15=>"内蒙古",
        21=>"辽宁",22=>"吉林",23=>"黑龙江",
        31=>"上海",32=>"江苏",33=>"浙江",34=>"安徽",35=>"福建",36=>"江西",37=>"山东",
        41=>"河南",42=>"湖北",43=>"湖南",44=>"广东",45=>"广西",46=>"海南",
        50=>"重庆",51=>"四川",52=>"贵州",53=>"云南",54=>"西藏",
        61=>"陕西",62=>"甘肃",63=>"青海",64=>"宁夏",65=>"新疆",
        71=>"台湾",81=>"香港",82=>"澳门",
        91=>"国外");
        //非法地区
        if (!array_key_exists(substr($idcard,0,2),$aCity)) {
            return false;
        }
        //验证生日
        if (!checkdate(substr($idcard,10,2),substr($idcard,12,2),substr($idcard,6,4))) {
            return false;
        }
        $idcard_base = substr($idcard, 0, 17);
        if (self::idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))){
            return false;
        }else{
            return true;
        }

    }

可以专门封到一个验证类中,直接调用就可以了

时间: 2024-12-20 13:22:12

后台身份证验证算法的相关文章

js身份证验证算法

var validateIdCard=function (id, backInfo) { var info={ y: "1900", m: "01", d: "01", sex: "male", valid: false, length: 0 }, initDate=function (length) { info.length=length; var a=length===15?0:2, // 15:18 temp; inf

Posts

07 Nov 2016 第二代身份证有着内在的因子算法,其依据于 中华人民共和国国家标准<公民身份号码>(GB11643-1999) ,我们可以根据该标准构建我们的身份证验证算法 app如何保证通讯安全 07 Nov 2016 ? ? ? ? ? ? ? ? ? ?... 深入PHP赋值行为 27 Oct 2016 php中mysqli和mysql区别 27 Oct 2016 一.mysql与mysqli的概念相关: 在配置jekyll过程中遇到的问题! 27 Oct 2016 ? ? ? ?

身份证校验,前台js校验,后台java校验

js校验: var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古", 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏", 33:"浙江",34:"安徽",35:"福建"

身份证号信息后台匹配

今天看到一篇好文章,关于通过身份号计算出正确性,属相,星座,果断引过来了. 身份证号码的结构: 要进行身份证号码的验证,首先要了解身份证号码的编码规则.我国身份证号码多由若干位数字或者数字与字母混合组成.早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,后来考虑到千年虫问题, 因为15位的身份证号码只能为1900年1月1日到1999年12月31日出生的人编号,所以又增加了18位身份证号码编号规则. 1>.18位身份证号码各位的含义: 1-2位省.自治区.直辖市代码:3-4位地级市

C#实现的18位身份证格式验证算法

18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999<公民身份号码>中做了明确的规定. GB11643-1999<公民身份号码>为GB11643-1989<社会保障号码>的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999<公民身份号码>从实施之日起代替GB11643-1989.GB11643-1999<公民身份号码>主要内容如

身份证号码验证算法(php和js实现)

原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21126994&id=3938244 http://www.jb51.net/article/57627.htm 从网上找的,已经测试通过,备忘 js: //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCodeValid(code) { var city={ 11:"北京"

C#后台验证身份证号码的一个方法

简单的调用了正则表达式进行简单的验证,记下来留着以后备用 1 if ((!Regex.IsMatch(txtID.Text, @"^(^\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$",RegexOptions.IgnoreCase))) 2 { 3 MessageBox.Show("请输入正确的身份证号码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); 4 r

18位身份证校验码验证算法

function checkCode(card){ if (/^\d{17}[\dxX]$/.test(card)) { var a = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]; var valide = [1,0,'X',9,8,7,6,5,4,3,2]; var s = 0; for (var i = 0; i < card.length - 1; i++) { s += card.charAt(i) * a[i]; } var mod = s % 11;

安卓入门实战项目-身份证信息查看器,精确解读身份证信息

本系列教程致力于可以快速的进行学习安卓开发,按照项目式的方法,通常一篇文章会做一个小程序.提高学习的兴趣. 一方面总结自己所得,另一方面可以通过自己的分享帮助更多学习的同仁. 因为知识的连贯性,推荐按照瞬息进行学习.目录链接:http://www.chengxiaoxiao.com/bozhu/1336.html 本教程由今日头条-做全栈攻城狮原创首发,转载请注明出处. 大学生求兼职:请联系wx:aiquanzhan 页尾提供github源代码下载地址. 一.项目描述 通过小程序实现精准解读身份