生成已知地区、生日的所有合规身份证号

yangshaoyang.cn

在已知所在地区行政编码、出生日期、性别的前提下,生成所有符合国家标准 GB 11643-1999的身份证号

<?php
// 生成所有符合规则的身份证号
function getIdCardNum($areaCode, $birthDay, $sex)
{
    if ($sex == "男") {// 性别标识 奇数男 偶数女
        $sexArr = ['1', '3', '5', '7', '9'];
    } else {
        $sexArr = ['2', '4', '6', '8', '0'];
    }
    $validateArr = ['0','1','2','3','4','5','6','7','8','9','X'];// 最后一位
    $count = 0;

    for ($i = 0; $i <= 99; $i++) {
        if ($i < 10) {// 遍历倒数三四位
            $i = '0'.(string)$i;
        }
        foreach ($sexArr as $sexNum) {// 遍历性别位
            foreach ($validateArr as $validateNum) {// 遍历校验位
                $idCard = $areaCode . $birthDay . $i . $sexNum . $validateNum;
                if (checkIdCard($idCard)) {
                    echo $idCard;// 输出符合校验规则的身份证号
                    echo "\n";
                    $count++;// 校验通过 计数
                }
            }
        }
    }
    echo '总数:'.$count;
}

// 检查位数及校验位
function checkIdCard($idCard)
{
    $idWeight = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];// 17位权重
    $idValidate = ['1','0','X','9','8','7','6','5','4','3','2'];// 身份证校验码

    $len = strlen($idCard);
    // 必须是18位
    if($len != 18){
        return false;
    }
    $num = 0;
    for ($i = 0; $i < 18 - 1; $i++){
        $num += intval($idCard[$i]) * $idWeight[$i];
    }
    $mode = $num%11;

    $lessCode = substr($idCard, -1, 1);
    if($lessCode == $idValidate[$mode]){
        return true;
    }
    return false;
}

$areaCode = "100101";// 六位地区码
$birthDay = "19491001";// 八位生日
$sex = "男";
getIdCardNum($areaCode, $birthDay, $sex);

yangshaoyang.cn


橙色时光
请先登录后发表评论
  • 最新评论
  • 总共0条评论