我是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)来种子随机数生成器,其中seed是我的application_id。可以获得重复的$ token。
感谢帮助。
答案 0 :(得分:7)
您可以使用:
sha1(time())
说明:sha1是哈希函数,哈希函数最重要的特性是它们永远不会产生不同字符串的相同哈希值,因此理论上time()总是唯一的,因此sha1(time())总会给你独特的固定宽度的字符串。
编辑:
您可以使用您的功能,但在给予令牌之前您可以连接到数据库并检查令牌是否存在,如果存在则生成新令牌,如果不存在则给予此令牌。这种机制将为您提供独特的令牌。
答案 1 :(得分:6)
尝试解决问题时,您可以应用以下内容以确保唯一代码:
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));
使用first()而不是get()。 $ user_code可能是唯一的,因此我们可以方便地取出第一个结果。
答案 2 :(得分:5)
您可以使用内置辅助函数:
str_random(int);
可以找到文档:Laravel 5.1 Docs
为确保它是唯一的,您可以随时检查名称是否已经存在,以及是否重新运行该函数以生成新字符串。
希望有所帮助。