Я создал функцию в php, которая генерирует хэш из числа (id), и мне нужно проверить, что столкновения не будет (два или более идентификаторов имеют одинаковый хеш). Какую функцию я могу использовать, чтобы проверить, не будет ли столкновений в следующих 99999999 ids? Спасибо!Как проверить хеш-столкновение
ответ
Если ваша хеш-функция работает так, как предполагалось, и всегда генерирует один и тот же вывод для одного и того же входа. И ваши входы ограничены номерами 99999999, вы можете просто генерировать хэши для этих чисел и убедиться, что дубликатов нет.
Несмотря на то, что хорошим решением было бы математически продемонстрировать, что ваша хеш-функция будет давать уникальные результаты для этих чисел.
Если хеш может быть абсолютно случайным, попробуйте использовать текущую временную метку в нем как дополнительный рандомизатор. Например:
$hash = sha1(microtime() * rand(1, 9999));
Вероятность появления дубликата в нем довольно тонкая. Кроме того, попробуйте установить поле базы данных как поле UNIQUE
, гарантируя, что дубликат INSERT невозможен. Затем, чтобы сделать вещи завершена, вы можете создать цикл, который пытается, пока это не удается, как так:?
// SHA1 values shouldn't need escaping, but it doesn't really hurt to be extra sure :)
$query = "INSERT INTO `table` (`hash`) VALUES('" . mysql_real_escape_string($hash) . "')";
// Let's try the insert with a max of 10 random hashes
$tries = 10;
while(mysql_query($query) !== true) {
if($tries <= 0) {
break; // Something is really failing, stop trying!
}
// If this point is reached, apparantly a duplicate was created. Try again.
$hash = sha1(microtime() * rand(1, 9999));
// Decrement the tries counter.
$tries--;
}
Если вы создадите хэш таким образом, вы просто найдете sha1-дайджест случайного числа. Он хочет создать функцию, которая создаст дайджест сообщения из числа, аналогично тому, как работает sha1. И он спрашивает, как он может доказать, что он уникален для конечного диапазона (я думаю) – aurbano
Хэш должен давать одинаковый результат каждый раз, когда используется функция хэширования. Добавление (плохого) псевдослучайного семестра на основе времени нарушит это! –
- 1. Как проверить/проверить использование NSURLCache?
- 2. Как проверить право проверить сайт?
- 3. как проверить все дети проверить
- 4. Как проверить/проверить/проверить/подтвердить мой пароль SSH?
- 5. Как проверить и проверить ли токен
- 6. Padre: как проверить/проверить строки Unicode?
- 7. Как проверить и проверить код построителя питания
- 8. Как проверить jQuery Проверить правила по умолчанию?
- 9. Проверить радиокнопки ООН проверить
- 10. Как проверить случайные варианты?
- 11. Как проверить возраст тега?
- 12. Как проверить IntentService android?
- 13. Как проверить два md5
- 14. Как проверить подключение C2DM
- 15. Как проверить входящие URL?
- 16. Как проверить System.Net.Mail.SmtpClient.Credential
- 17. Как проверить версию API?
- 18. Как проверить формат файла?
- 19. Как проверить токен SAML
- 20. Как проверить Laravel SessionID?
- 21. Как проверить PayPal DoExpressCheckoutPayment?
- 22. Как проверить, если localhost
- 23. Как проверить версию db2
- 24. Как проверить SDK?
- 25. как проверить систему аутентификации?
- 26. Как проверить путь отдыха?
- 27. Как проверить сингапурский FIN?
- 28. Как проверить статус AVPlayer?
- 29. как проверить ионные переключатели
- 30. как проверить возможность устройства
петля ......... –
Каждый хэш-функция имеет столкновений. Если вам нужна вероятность того, что два случайных элемента имеют одинаковый хэш, вам понадобится математика. –
@JochenRitzel: Люди всегда, кажется, считают, что по какой-то причине, но это не обязательно так. См. Вопрос [«Функция идеального хэша для кодов удобочитаемого заказа»] (http://stackoverflow.com/q/9551091/978917). (Разумеется, должны быть столкновения, если количество правовых входов больше числа юридических результатов, но если ОП требует только уникальности от 0 до 99999999, то это вряд ли будет иметь место.) – ruakh