我是 laravel 5 的新手。我正在做一个项目,我想为每个应用程序分配一些随机可读的唯一字符串。我知道可以用作种子的每个应用程序 ID。由于该应用程序将在公司内部使用,因此我不太担心安全性。我希望表大小会增长,所以我的目标是尽可能地实现唯一性,因为 DB 中的字段是唯一的。类似(EN1A20、EN12ZOV 等)的代码。如果该函数可以让我传递我想要返回的字符串的长度,那就太棒了。
编辑 下面显示的是我对这个问题的尝试
private function generate_app_code($application_id) { $token = $this->getToken(6, $application_id); $code = 'EN'. $token . substr(strftime("%Y", time()),2); return $code; } private function getToken($length, $seed){ $token = ""; $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $codeAlphabet.= "0123456789"; mt_srand($seed); // Call once. Good since $application_id is unique. for($i=0;$i<$length;$i++){ $token .= $codeAlphabet[mt_rand(0,strlen($codeAlphabet)-1)]; } return $token; }
上面的代码可以解决问题吗?
编辑
实际上我从这篇文章PHP: How to generate a random, unique, alphanumeric string? 提出上述方法,但该帖子并未完全解决我的问题。我的目标是生成一个长度为 6 到 8 的字符串(字母数字且可读)。我的管理员将使用此字符串进行查询。在我的函数中,我有 mt_srand($seed) 为随机数生成器播种,其中种子是我的 application_id。有可能获得重复的 $token。
感谢帮助。
通过尝试解决问题,您可以应用以下内容来确保唯一的代码:
do { $token = $this->getToken(6, $application_id); $code = 'EN'. $token . substr(strftime("%Y", time()),2); $user_code = User::where('user_code', $code)->get(); } while(!empty($user_code));
为了避免 laravel 中的无限循环,请使用
do { $token = $this->getToken(6, $application_id); $code = 'EN'. $token . substr(strftime("%Y", time()),2); $user_code = User::where('user_code', $code)->get(); } while(!$user_code->isEmpty());
http://laravel.com/api/5.0/Illuminate/Support/Collection.html#method_isEmpty
或与
do { $token = $this->getToken(6, $application_id); $code = 'EN'. $token . substr(strftime("%Y", time()),2); $user_code = User::where('user_code', $code)->first(); } while(!empty($user_code));
代替 get(),使用 first()。$user_code 可能是唯一的,因此我们可以方便地提取第一个结果。