Генератор случайных строк, который не повторяется в контроллере laravel - PullRequest
0 голосов
/ 05 июля 2018

Я создал эту функцию в моем контроллере 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 голосов
/ 30 января 2019

Вы вызывали эту функцию много раз за очень короткое время? Тогда я считаю, что проблема microtime(). Эта функция возвращает строку, разделенную пробелом. Первая часть является дробной частью секунды, вторая часть является неотъемлемой частью.

Таким образом, если функция вызывается в течение одной и той же секунды, $now должен быть таким же, исходя из того, что $result не изменится.
Кроме того, если функция вызывается в течение короткого времени (скажем, несколько секунд), * ​​1007 * будет аналогичным (например, 1283846202 и 1283846203). В этом случае будет изменяться только правая часть $result.

0 голосов
/ 05 июля 2018

Я предлагаю вам использовать то, что предоставляет Laravel для генерации случайной строки. как: strtolower(str_random(4)) как упомянуто @ kenken9999

Тем не менее, вот почему я думаю это дало такой же результат для вас:

Я выполнил вашу функцию несколько раз, и это выходные данные:

becpy
becqa
becqd
becqd
becqe

Я думаю, что когда вы проверили их, они просто оказались одинаковыми, а когда вы сделали composer dump-autoload, вы увидели другой результат.

Дайте мне знать, если я ошибаюсь.

...