如何在laravel 5中创建一个唯一的随机字符串

Fok*_*est 10 php random laravel-5

我是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;
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码可以解决这个问题吗?

编辑

实际上我从这篇文章中借用了一些想法PHP:如何生成一个随机的,唯一的,字母数字字符串?提出上述方法但该帖子并未完全解决我的问题.我的目标是生成一个长度为6到8的字符串(字母数字和可读).我的管理员将使用此字符串进行查询.在我的函数中,我有mt_srand($ seed)来种子随机数生成器,其中seed是我的application_id.可以获得重复的$ token.

感谢帮助.

fic*_*489 9

您可以使用 :

sha1(time())
Run Code Online (Sandbox Code Playgroud)

说明:sha1是哈希函数,哈希函数最重要的特性是它们永远不会产生不同字符串的相同哈希值,因此理论上time()总是唯一的,因此sha1(time())总会给你一个固定的唯一字符串宽度.

编辑:

您可以使用您的功能,但在给予令牌之前您可以连接到数据库并检查令牌是否存在,如果存在则生成新令牌,如果不存在则给予此令牌.这种机制将为您提供独特的令牌.


use*_*178 7

通过尝试解决该问题,您可以应用以下内容来确保唯一的代码:

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));
Run Code Online (Sandbox Code Playgroud)

编辑

为了避免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());
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

代替get(),使用first()。$ user_code可能是唯一的,因此我们可以方便地提取第一个结果。


Fly*_*arl 6

您可以使用内置的辅助函数:

str_random(int);
Run Code Online (Sandbox Code Playgroud)

可以找到该文档:Laravel 5.1 Docs

为确保其唯一性,您始终可以检查名称是否存在,以及是否确实重新运行该函数以生成新字符串。

希望能有所帮助。

  • 看起来“str_random”是一个全局助手,现在已经消失了,但您仍然可以使用 \Illuminate\Support\Str::random()。 (2认同)