request->param(); $rule = [ 'old_url'=>'require' ]; $validate = new Validate($rule); if(!$validate->check($params)){ HelperService::returnJson([ 'code'=>400, 'msg'=>$validate->getError(), 'data'=>"" ]); } $num = 0; $flag = 'NEW'; while(true){ $shortUrlModel = new ShortUrlModel(); $res = $shortUrlModel->where(['old_url'=>"{$params['old_url']}"])->find(); if($res){ $url_str = $res['url_str']; $flag = 'OLD'; break; } $random = rand(0,9999); $random = str_pad($random,4,'0',STR_PAD_LEFT); $url_str = $this->createShortUrl("{$params['old_url']}",$random); //首先看库里有没有没有插入 $res = $shortUrlModel->where(['url_str'=>"{$url_str}"])->find(); if(empty($res)){ break; } $num++; } if('NEW' == $flag){ $shortUrlModel = new ShortUrlModel(); $shortUrlModel->insert([ 'old_url'=>"{$params['old_url']}", 'url_str'=>"{$url_str}", 'num'=>$num, ]); } HelperService::returnJson([ 'code'=>200, 'msg'=>"http://{$_SERVER['HTTP_HOST']}?to={$url_str}", 'data'=>$flag ]); } private function createShortUrl($or_url,$salt){ $md5_url = md5($or_url); //$salt = '0826';//这里不高于aaaa就不会出现61以上的数字,所以来说,后面的特别符号是不会出现的! $md5_url = $this->addSalt($md5_url,$salt); $short_url = ''; for($i=0;$i<6;$i++){ $current_str = substr($md5_url,$i*6,6); //处理当前串的值 $short_url .= $this->ZChar($current_str); } return $short_url; } /** * 处理字符串 * @param $str * @return int */ private function dealStr($str){ if(strlen($str) != 6){ die("dealStr:{$str}error"); } $count = ''; for($i=0;$i<6;$i++){ //加权,避免不同序列的和一致 $number = hexdec($str[$i])*($i+1)%12; $count += $number; } return $count % 66; } /** * 字码表 * @param $char_point * @return mixed */ private function char($char_point){ $char_array = ["0","1","2","3","4","5", "6","7","8","9","a","b","c","d", "e","f","g","h","i","j","k","l", "m","n","o","p","q","r","s","t", "u","v","w","x","y","z","A","B", "C","D","E","F","G","H","I","J", "K","L","M","N","O","P","Q","R", "S","T","U","V","W","X","Y","Z", "$","@",'+',"="]; $char_point = intval($char_point); if($char_point < 0 || $char_point > 65){ die('char:'.$char_point.' error'); } return $char_array[$char_point]; } /** * 添加盐 * @param $md5_url * @param $salt * @return string */ private function addSalt($md5_url,$salt){ if(strlen($md5_url) != 32){ die('addSalt:{$md5_url} error'); } $len = strlen($salt); for($i=0;$i<$len;$i++){ $position = hexdec($md5_url[$i]); $weight = ceil($position/8); $position = $position * $weight; $pre = substr($md5_url,0,$position); $next = substr($md5_url,$position); $md5_url = $pre.$salt[$i].$next; } return $md5_url; } /** * 加密字节 * @param $current_str * @return mixed */ private function ZChar($current_str){ $Vchar = $this->dealStr($current_str); return $this->char($Vchar); } }