Обучение/Помощь новичкам | Два одинаковых хэша
Тема закрыта by
SNEG
Один человек говорит что может быть два одинаковых хэша, другой говорит что доктора стренджа не существует, что crypt не выдаст microtime() в связке с rand () дубликат хэша через пол года, или лет 5. Вопросы так же и остались может быть ли 2 одинаковых хэша ? Зайду на перед задам ещё вопрос, как обработать в php если выдал дубликат чтобы не выбрасывать ошибку в виде условия "извините но такой хэш есть попробуйте ещё раз может вам повезёт"? Если в таблице хэшу присвоен уникальный идентификатор ?
________
посл. ред. 14.08.2023 в 19:30; всего 2 раз(а); by SNEG
php
$key = microtime().rand(); $hash = crypt($key, '$2y$10$'.substr($key, 0, 22)); ________
посл. ред. 14.08.2023 в 19:30; всего 2 раз(а); by SNEG
Один человек говорит что может быть два одинаковых хэша, другой говорит что доктора стренджа не существует, что crypt не выдаст microtime() в связке с rand () дубликат хэша через пол года, или лет 5. Вопросы так же и остались может быть ли 2 одинаковых хэша ? Зайду на перед задам ещё вопрос, как обработать в php если выдал дубликат чтобы не выбрасывать ошибку в виде условия "извините но такой хэш есть попробуйте ещё раз может вам повезёт"? Если в таблице хэшу присвоен уникальный идентификатор ?
php
$key = microtime().rand(); $hash = crypt($key, '$2y$10$'.substr($key, 0, 22)); php
$key = uniqid(mt_rand(), true); $hash = crypt($key, '$2y$10$' . substr(md5($key), 0, 22)); ________
посл. ред. 15.08.2023 в 00:13; всего 3 раз(а); by SNEG
Первая часть поста - да, возможно
Вторая часть поста - не выводи ошибку, а обработай её, сгенерировав новый хэш
Вторая часть поста - не выводи ошибку, а обработай её, сгенерировав новый хэш
Первая часть поста - да, возможно
Вторая часть поста - не выводи ошибку, а обработай её, сгенерировав новый хэш
Или почитать в интернете и сделать вывод, на основе того, что в жизни не видел, это нормально?
Шанс совпадения равен 0 и точка. Для совпадения требуется около млрд запросов в 1 сек, тогда может и совпадёт 1 пара.
Покажи мне в своей практике, где встречал такое
Или почитать в интернете и сделать вывод, на основе того, что в жизни не видел, это нормально?
Хэш-функции обычно разрабатываются таким образом, чтобы минимизировать возможность коллизий (ситуации, когда двум разным входным данным соответствует один и тот же хэш). Однако, абсолютно исключить коллизии невозможно из-за ограниченного размера хэша и бесконечного количества входных данных. Таким образом, в теории, двум разным входам может быть присвоен одинаковый хэш. В вашем примере кода, вы используете входные данные, включающие метку времени и случайное число для генерации хэша. Это уменьшает вероятность коллизий, но не исключает их полностью. Если вы сталкиваетесь с ситуацией, когда хэш-значение уже существует в вашей таблице, вы можете обработать это следующим образом: В данном примере кода, если сгенерированный хэш уже существует в базе данных, вы пробуете сгенерировать новый хэш и повторяете процесс. Если новый хэш также уже существует, вы можете предпринять необходимые действия в зависимости от контекста.
php
$key = microtime().rand(); $hash = crypt($key, '$2y$10$'.substr($key, 0, 22)); // Проверяем, существует ли хэш в таблице if (hashExistsInDatabase($hash)) { // Генерируем новый хэш и повторяем проверку $key = microtime().rand(); $hash = crypt($key, '$2y$10$'.substr($key, 0, 22)); if (hashExistsInDatabase($hash)) { // Если повторно сгенерированный хэш также уже существует, выполните необходимые действия // например, вы можете выбросить ошибку или предоставить пользователю новый шанс ввода. } else { // Используйте новый хэш, так как он уникален } } else { // Используйте сгенерированный хэш, так как он уникален } // Функция для проверки существования хэша в базе данных function hashExistsInDatabase($hash) { // Реализуйте эту функцию в соответствии с вашей системой базы данных // Она должна вернуть true, если хэш уже существует, и false в противном случае } Хэш-функции обычно разрабатываются таким образом, чтобы минимизировать возможность коллизий (ситуации, когда двум разным входным данным соответствует один и тот же хэш). Однако, абсолютно исключить коллизии невозможно из-за ограниченного размера хэша и бесконечного количества входных данных. Таким образом, в теории, двум разным входам может быть присвоен одинаковый хэш. В вашем примере кода, вы используете входные данные, включающие метку времени и случайное число для генерации хэша. Это уменьшает вероятность коллизий, но не исключает их полностью. Если вы сталкиваетесь с ситуацией, когда хэш-значение уже существует в вашей таблице, вы можете обработать это следующим образом:
php
$key = microtime().rand(); $hash = crypt($key, '$2y$10$'.substr($key, 0, 22)); // Проверяем, существует ли хэш в таблице if (hashExistsInDatabase($hash)) { // Генерируем новый хэш и повторяем проверку $key = microtime().rand(); $hash = crypt($key, '$2y$10$'.substr($key, 0, 22)); if (hashExistsInDatabase($hash)) { // Если повторно сгенерированный хэш также уже существует, выполните необходимые действия // например, вы можете выбросить ошибку или предоставить пользователю новый шанс ввода. } else { // Используйте новый хэш, так как он уникален } } else { // Используйте сгенерированный хэш, так как он уникален } // Функция для проверки существования хэша в базе данных function hashExistsInDatabase($hash) { // Реализуйте эту функцию в соответствии с вашей системой базы данных // Она должна вернуть true, если хэш уже существует, и false в противном случае } Насоветовал ты конечно идей
________
посл. ред. 15.08.2023 в 15:05; всего 2 раз(а); by SNEG
Рекурсия в помощь. Если найдется совпадение, то просто пересоздай хэш. Что то типа того
________
посл. ред. 15.08.2023 в 15:29; всего 1 раз(а); by invoker
php
function generateHash() { return сгенерируемый хэш; } function getHash() { $hash = generateHash(); if (проверка, если хэш есть в базе) { return getHash(); } return $hash; } ________
посл. ред. 15.08.2023 в 15:29; всего 1 раз(а); by invoker