создать уникальный 8-значный номер - PullRequest
1 голос
/ 02 октября 2019

В настоящее время я создаю приложение, которое должно дать пользователю уникальный 8-значный код (только цифры), который он может ввести для доступа к закрытым частям моего веб-сайта, рассматривать его как элементарную аутентификацию, т.е. вводить код доступа, пароль совпадает с пользователем, пользователь возвращается. У меня проблемы с созданием уникального 8-значного кода. Я знаю, что PHP имеет uniqid(), но это возвращает слишком длинную строку.

Я думал о создании хеша time() и IP-адреса пользователя, но laravel Hash::create возвращает целые числа и символы.

Может кто-нибудь указать в направлении создания случайного 8цифровой код? Я также пытался mt_rand, но есть вероятность, что это может создать совпадающие цифры, если, конечно, я не проверю базу данных на наличие кода перед сохранением и повторно сгенерирую, если он существует?

Ответы [ 5 ]

0 голосов
/ 02 октября 2019
rand(10000000, 99999999);

У вас есть шанс 1/89999999 попасть на тот же номер, чтобы вы могли проверить, использовался ли он уже или нет;)

0 голосов
/ 02 октября 2019

Мое предложение - цикл do-while, в этом случае, если случайная строка уже существует, она сгенерирует новую. Сгенерируйте код так, как вы хотите, но на самом деле у Laravel есть помощник (str_random()), чтобы справиться с этим, если хотите.

/**
* Create a unique code
*
* @return string;
*/
if ( ! function_exists('generateUniqueCode')) {
    function generateUniqueCode()
    {
        do {
            $unique_code = str_random(12);
        } while (\App\User::where('code', $unique_code)->count() > 0);


        return $unique_code;
    }
}
0 голосов
/ 02 октября 2019

Вам необходимо зарегистрировать БД, если номер существует или нет

$randnum = rand(11111111,99999999);

Это сгенерирует случайное 8-значное число

0 голосов
/ 02 октября 2019

Попробуйте эту функцию Для Laravel он также вернет 8-значный номер с проверкой, уникальной также в дБ.

В функции контроллера

$expense_id = Expense::get_random_string();

Модал

public static function get_random_string()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }
    $random_unique  =  sprintf('%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));

    $expense = Expense::where('expense_id', '=', $random_unique)->first();
    if ($expense != null) {
        $random_unique = $this->get_random_string();
    }
    return $random_unique;
}
0 голосов
/ 02 октября 2019

Это мой код для генерации случайного числа:

public function generateRandomNumber($length = 8)
{
  $random = "";
  srand((double) microtime() * 1000000);

  $data = "123456123456789071234567890890";
  // $data .= "aBCdefghijklmn123opq45rs67tuv89wxyz"; // if you need alphabatic also

  for ($i = 0; $i < $length; $i++) {
          $random .= substr($data, (rand() % (strlen($data))), 1);
  }

  return $random;

}
...