Является ли это рекурсивное генерирование случайных строк вычислительно дорогим? - PullRequest
0 голосов
/ 25 мая 2018

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

        public function generateUniqueReferralCode()
        {
            $referral_code = str_random(8);

            if(User::where('referral_code', $referral_code)->exists()) {
                $referral_code = $this->generateUniqueReferralCode();
            }

            return $referral_code;
        }

Мой вопрос: это вычислительно дорого?Можно ли сделать это более эффективным способом, поскольку он должен сканировать таблицу пользователей?Допустим, у нас 1 миллион пользователей, он проверит по 1 миллиону записей пользователей, если ключ уже существует.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Функции PHP довольно дороги.Поэтому я думаю, что следующее немного быстрее (не тестировалось):

public function generateUniqueReferralCode() {
    $referral_code = str_random(8);

    while (User::where('referral_code', $referral_code)->exists()) {
        $referral_code = str_random(8);
    }

    return $referral_code;
}
0 голосов
/ 25 мая 2018

Нет, база данных использует эффективную индексацию (деревья поиска или хэш-коды) для эффективного поиска, поэтому количество записей практически не имеет значения.

Но почему бы вам просто не увеличить счетчик, чтобы неявно гарантироватьуникальность?(И добавьте случайную соль, если хотите.)

0 голосов
/ 25 мая 2018

Мой подход был бы немного проще.Вместо того чтобы проверять все эти записи на предмет уникальности, я скорее сгенерирую случайный ключ и установлю первичный ключ последней записи или записи, которая будет сгенерирована.

Например, вот мой поток мыслей

  1. Создать случайный ключ - 1234abc
  2. Получить первичный ключ последней записи.Результат - 3
  3. Добавить его к ключу - 1234abc3 (всегда будет незаполненным)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...