Как справиться с хеш-коллизиями?
Я разрабатываю игру, где каждая вещь в игровом мире представлена глобальным уникальным идентификатором.
Эти идентификаторы определяют каждый бит 64 бит и генерируются путем объединения времени создания, сетевого адреса машины и случайного числа. Согласно статье Википедии о проблеме День рождения, вероятность столкновения хэшей составляет 0,1% для двухсот миллионов записей.
Поскольку маловероятно, что я собираюсь получить столько записей, можно было бы подумать, что никакой хэш никогда не столкнется. Но я не хочу на это надеяться, но пусть мое приложение обрабатывает редкий случай столкновения с идентификатором, таким образом, столкновение хэшей.
В противном случае поведение было бы очень нежелательным, потому что две независимые вещи в игровом мире имели бы связь, таким образом разделяя их свойства, такие как положение, движение, точки здоровья и т.д.
Как я могу обрабатывать хеш-коллизии? Как обычно они обрабатываются?
Ответы
Ответ 1
Обычно хеш-столкновения обрабатываются двумя способами:
-
Используйте большой хеш, так что столкновения практически невозможны.
-
Рассмотрим хеш-коды, которые должны быть неидеальными, и используйте сопоставитель равенства для фактических данных для определения уникальности.
128-битный GUID использует первый метод. Класс HashSet<T>
в .NET является примером второго метода.