Существует множество систем, которые зависят от уникальности определенного значения. Все, что использует GUID, приходит на ум (например, реестр Windows или другие базы данных), но также и вещи, которые создают хэш из объекта, чтобы идентифицировать его, и поэтому этот хэш должен быть уникальным.Обработка столкновений, близких к невозможным, по обязательному значению
Хэш-таблица обычно не имеет против, если два объекта имеют один и тот же хеш, поскольку хеширование используется только для разбивки объектов на категории, так что при поиске не все объекты в таблице, а только те объекты в одну и ту же категорию (ведро) следует сравнивать для идентификации с объектом поиска.
Другие реализации, однако (по-видимому) зависят от уникальности. Мой пример (вот что заставило меня спросить об этом) - это идентификаторы ревизии Mercurial. entry на Mercurial список рассылки правильно утверждает
шансы на хэш набора изменений сталкивающихся случайно в первые млрд фиксаций в основном равен нулю. Но заметьте, если это произойдет. И вы станете знаменитым, как парень, который случайно сломал SHA1.
Но даже самая маленькая вероятность не означает невозможность. Теперь я не хочу объяснять, почему полностью опираться на уникальность (это обсуждалось, например, here). Это очень ясно для меня.
Скорее, я хотел бы знать, (возможно, с помощью примеров из вашей собственной работы):
Существуют ли какие-либо рекомендации относительно того, охватывающих эти невероятные случаи так или иначе?
Следует ли их игнорировать, потому что более вероятно, что особенно сильные солнечные ветры приводят к неправильному считыванию жесткого диска?
Должны ли они, по крайней мере, быть протестированы, если только сбой с сообщением «Я сдаюсь, вы сделали невозможное» для пользователя?
Или должны ли эти случаи обрабатываться изящно?
Для меня, особенно следующий интересен, хотя они несколько рискованных-Филей:
Если вы не обрабатывать эти случаи, что вы делаете против инстинктивного чувства, что дон» t слушайте вероятности?
Если вы справляетесь с ними, как вы оправдываете эту работу (для себя и других), учитывая, что существуют более вероятные случаи, которые вы не обрабатываете, например сверхновости?
Существует также ненулевая вероятность того, что вы сделаете квантовое туннелирование через свое кресло и упадете на пол, но при этом подушка под ней переполнена. Это сильно зависит от того, что вы делаете. Если вы разрабатываете туннельный микроскоп, неожиданным и невероятным является то, что вы хотите обработать (особенно потому, что в этом масштабе он становится незначительным). Это технически более вероятно, чтобы сталкиваться с ошибками памяти, чем столкновения SHA, но я никогда не видел серьезного обращения к OOM кода. –
Вот, например, пример, где MSFT checking for collisions in the GUID space вызвал ошибку в SQL Server, которая должна быть включена в Windows 2000. – corprew
Недавняя уязвимость [OpenSSL] (http://www.ubuntu.com/usn/usn-612 -1), вероятно, было бы обнаружено намного раньше, если разработчики включили некоторый тестовый код. Очевидно, что он не должен пытаться запускать все возможные источники, но вы получите довольно хорошее представление о шансах, если он выполнит миллион итераций без предупреждения. Знание лучше веры. – l0b0