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

2022-08-30 20:48:36

我是 5 号 laravel 的新手。我正在处理一个项目,我想为每个应用程序分配一些随机可读的唯一字符串。我了解可能用作种子的每个应用程序ID。由于该应用程序将在公司内部使用,因此我不太担心安全性。我预计表的大小会增长,所以我的目标是尽可能地实现唯一性,因为数据库中的字段是唯一的。类似(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中借用了一些想法:如何生成一个随机的,唯一的字母数字字符串?来提出上述方法,但这篇文章并没有完全解决我的问题。我的目标是生成一个长度为6到8的字符串(字母数字和可读)。此字符串将由我的管理员用于查询目的。在我的函数中,我mt_srand($seed)来为随机数生成器设定种子,其中种子是我application_id。有可能获得重复$token。

感谢您的帮助。


答案 1

您可以使用 :

sha1(time())

说明:sha1是哈希函数,哈希函数最重要的特征是它们永远不会产生不同字符串的相同哈希,因此由于time()在理论上总是唯一的,sha1(time())将始终为您提供具有固定宽度的唯一字符串。

编辑:

您可以使用您的函数,但在提供令牌之前,您可以连接到数据库并检查令牌是否存在,如果存在则生成新令牌,如果不存在则给出此令牌。此机制将为您提供唯一的令牌。


答案 2

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

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可能是唯一的,因此我们可以方便地提取出第一个结果。


推荐