随机产生一个类似身份证号码的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; } } }
相关文章推荐
- 用java中的Math.random()函数产生一个简单的随机字符串
- python 身份证号码验证和随机产生
- C#随机生成18位身份证号码
- 如何随机产生一个自定义长度的字符串?
- 随机产生一个字符串
- 一个产生随机数字 字符串验证码 日期的类扩展实现
- 随机产生一个跟时间相关的字符串
- 一个生成随机身份证号码的接口
- 字符串-数组的定义和关系,应用产生一个随机字符串
- 产生所有的18位和15位的身份证号码
- 一个产生随机字符串随机密码的类
- 如何产生一个随机排列?(弱问)
- 在.NET中产生随机密码字符串
- 产生一个int数组,长度为100,并向其中随机插入1-100
- (原創) 写一个字符串相加产生整数的function (C/C++)
- 从oracle表中随机取记录,产生随机数和随机字符串
- 一个获得随机字符串的asp函数
- 18位身份证号码检验JS脚本函数修正
- 15位身份证号码转18位
- 身份证号码的验证及15位升18位算法