Я использую процесс, чтобы поставить имя на изображениях профиля пользователя, и я боюсь коллизий.
Шаблон имени, который я использую, следующий:
9999999_9999999_9999999
Таким образом, изображения названы как:
4533381_1284948_8023255.jpg
Диапазон до целого числа от 1.000.000 в 9.999.999
Необходимо проверить, существует ли изображение с таким именем в каталоге изображений профиля пользователя? (при условии, что все изображения находятся на одном уровне каталогов).
Целые числа генерируются с использованием функции php mt_rand(1000000,9999999);
Вероятность столкновения очень мала в вашем случае (хотя и возможна).
Подсчитываем все возможные значения имени изображения: (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, но немного более сложный, включающий данные, на которые рассчитывается хеш, и счетчик (который влияет на вычисление хеша). Больше кода без преимуществ, ИМО.
Простой ответ: Нет.
Длинный ответ: Даже с 32-значной случайной цепочкой цифр и букв, вы в конечном итоге, возможно, столкнетесь с коллизией. Как кто-то прокомментировал, вы должны попытаться использовать что-то, связанное с пользователем, такое как его идентификатор пользователя, и хэшировать это, используя некоторую форму хэширования.
Увидеть Вот для хеширования в PHP.