您的位置:首页 > 其它

随机产生一个类似身份证号码的18位字符串

2017-04-28 13:56 330 查看
我们在玩一些游戏的时候,有的会要求我们填写身份证信息,而且有较为严格的身份证验证,给人的感觉就像是真能验证一样,其实想要真正的验证身份证信息是否正确是需要接入公安部门的身份证查询系统的.
然而并不是所有的软件都能拿到这个权限的,而没有拿到权限的他们是怎么判断的尼,其实答案就是身份证的最后一位,通过计算来判断身份证的最后一位是否正确就行了.
下面我将提供两种方式来产生一个随机的18位字符串
方式一:可自定义产生区间


public function random_card(){
$city = 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);
//校验位
$parity = array('1','0','X','9','8','7','6','5','4','3','2');
//       $a = array('a','b','c');
$arr = array(0,1,2,3,4,5);
$str = '';
//       echo $city[array_rand($city)];
//前两位
$str .=$city[array_rand($city)];
//地区位后四位
for($i=0;$i<4;$i++){
$str .=$arr[array_rand($arr)];
}
//出生年 随机20世纪
$str .= '19'.mt_rand(0,9).mt_rand(0,9);
//月份
$month = array('01','02','03','04','05','06','07','08','09','10','11','12');
$str .=$month[array_rand($month)];
//天
$day = mt_rand(0,3);
if($day==3){
$str .=$day.mt_rand(0,1);
}else{
$str .=$day.mt_rand(0,9);
}
//顺序码
for($i=0;$i<3;$i++){
$str .=mt_rand(0,9);
}
//计算加权因子
for($i=18;$i>1;$i--){
$factor[] = fmod(pow(2,$i-1),11);
}
//将加权因子和身份证号对应相乘,再求和
$sum = 0;
for($i=0;$i<count($factor);$i++){
$sum +=$factor[$i]*$str[$i];
}
//将sum对11求余
$mod = fmod($sum,11);
$str .=$parity[$mod];
echo $str;
}


方式二:先随机产生一个17位数字,再加上一位校验码,检测该18位字符串是否符合身份证规则

public function varifi_card($card=''){
//将身份证转化为string
$cardStr = (string)$card;
//验证身份证长度是否为18位
if(strlen($cardStr)==18){
//           验证格式是否正确
$pattern = "/\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)/i";
if(preg_match($pattern,$cardStr)){
//匹配前两位所对应的地区是否正确
$city = 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(in_array(substr($cardStr,0,2),$city)){
//计算加权因子
for($i=18;$i>1;$i--){
$factor[] = fmod(pow(2,$i-1),11);
}
//校验位
$parity = array('1','0','X','9','8','7','6','5','4','3','2');
//将加权因子和身份证号对应相乘,再求和
$sum = 0;
for($i=0;$i<count($factor);$i++){
$sum +=$factor[$i]*$cardStr[$i];
}
//将sum对11求余
$mod = fmod($sum,11);
//                   如果校验位的第$mod位与身份证最后一位相等,则身份证验证通过
if($parity[$mod]==substr($cardStr,-1,1)){
return true;
}else{
return false;
}
}
}else{
echo '身份证格式错误';
}
}else{
echo '输入的18位身份证号码';
}
}

public function get_randomcard(){
$str = '';
$boolean = ture;
//校验位
$parity = array('1','0','X','9','8','7','6','5','4','3','2');
while ($boolean){
//           随机一个17位的数字
$str .=mt_rand(0,99999999999999999);
$str .=$parity[array_rand($parity)];
//           判断身份证是否正确
$card = $this->varifi_card($str);
if($card){
//正确则返回
return $str;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: