Могу ли я доверять процессу генерации ключей без проверки на наличие дубликатов?

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

9999999_9999999_9999999

Таким образом, изображения названы как:

4533381_1284948_8023255.jpg

Диапазон до целого числа от 1.000.000 в 9.999.999
Необходимо проверить, существует ли изображение с таким именем в каталоге изображений профиля пользователя? (при условии, что все изображения находятся на одном уровне каталогов).

Целые числа генерируются с использованием функции php mt_rand(1000000,9999999);

1

Решение

Вероятность столкновения очень мала в вашем случае (хотя и возможна).

  • Подсчитываем все возможные значения имени изображения: (9999999-1000000+1)^3 == 7.29 * 10^20,

    Подсказка: Вы можете увеличить это значение, генерируя числа между 0 а также 9999999 и дополняем их нулями при преобразовании в строки, например: sprintf("%07d", $number)

  • mt_rand это относительно хороший генератор случайных чисел.

Столкновение будет наверное никогда не случится.


Однако, если это легко в контексте вашего приложения, вы можете реализовать проверку на то, что имя не занято, а если нет, просто сгенерировать случайное имя таким же образом.

Типа do { $name = generate_name(); } while(is_occupied($name)); петля.


Обратите внимание, что это решение безопаснее, чем детерминированное хеширование предлагается в комментариях.

Причина в том, что коллизии хэшей также возможны, и если это произойдет, то все готово — это детерминировано, и у вас нет возможности сгенерировать другое случайное число.

Или вы должны использовать цепочка хеш-функций для случая столкновений. Это означает аналогичный цикл do-while, но немного более сложный, включающий данные, на которые рассчитывается хеш, и счетчик (который влияет на вычисление хеша). Больше кода без преимуществ, ИМО.

1

Другие решения

Простой ответ: Нет.

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

Увидеть Вот для хеширования в PHP.

0

По вопросам рекламы [email protected]