在laravel控制器中不重复的随机字符串生成器

时间:2018-07-05 13:43:28

标签: php laravel laravel-5 autoload

我在laravel控制器中创建了此函数。

function incrementalHash($len = 5){
    $charset = "0123456789abcdefghijklmnopqrstuvwxyz";
    $base = strlen($charset);
    $result = '';

    $now = explode(' ', microtime())[1];
    while ($now >= $base){
        $i = $now % $base;
        $result = $charset[$i] . $result;
        $now /= $base;
    }
    return substr($result, -5);
}

然后我有一个函数可以在数据库中插入一些东西。此功能使用上述功能。但是每次使用它时,我都会从上述函数中得到相同的结果。我尝试了composer dump-autoload,结果发生了变化。我不知道发生了什么事?为什么此方法总是返回相同的结果。我如何使用此方法,并且不转储自动加载而不会收到相同的结果?这是我的控制器:

public function add_user_create()
{
    $user = new User;
    $user->user_id = Request()->input('user_id');
    $user->user_name = Request()->input('user_name');
    $user->fcm = Request()->input('fcm');
    $user->email = Request()->input('email');
    $user->token = Request()->input('token');
    $user->profile_pic = Request()->input('profile_pic');
    $user->api_token = str_random(60);
    $user->ref_ID = $this->incrementalHash(4);
    $user->save();
}

2 个答案:

答案 0 :(得分:0)

我建议您使用Laravel提供的内容生成随机字符串。像:@ kenken9999

所述的strtolower(str_random(4))

但是,这是为什么我认为为您带来了相同的结果:

我多次执行了您的函数,这些是输出:

becpy
becqa
becqd
becqd
becqe

我认为当您检查它们时,它们恰好是相同的,而当您进行composer dump-autoload时,您偶然会看到不同的输出。

如果我错了,请告诉我。

答案 1 :(得分:0)

您是否在很短的时间内多次调用了此函数?然后,我认为问题是microtime()。此函数返回以空格分隔的字符串。第一部分是秒的小数部分,第二部分是秒的整数部分。

因此,如果在同一秒内调用该函数,则$now应该相同,基于此,$result不会改变。
此外,如果在短时间内(比如说几秒钟)调用了该函数,则$now将会是相似的(例如12838462021283846203)。在这种情况下,只有$result的右侧会有所不同。