Как избежать коллизий с помощью HashCode.Combine? - PullRequest
0 голосов
/ 14 декабря 2018

Я сталкиваюсь с конфликтом при создании хеш-таблицы с довольно маленьким набором данных (~ 100 тыс. Строк).Я что-то здесь не так делаю?

Вот пример 2 бит данных, которые обычно генерируют одинаковые хэши.(При случайном запуске генерируются разные хэши):

long long1 = 330765;
long long2 = 227691;
DateTime date1= new DateTime(2016, 5, 24);
DateTime date2= new DateTime(2016, 1, 25);

var c1 = HashCode.Combine(long1, date1);
var c2 = HashCode.Combine(long2, date2);
Console.WriteLine(c1);
Console.WriteLine(c2);

Воспроизводится с помощью dotnetcore 2.1

1 Ответ

0 голосов
/ 14 декабря 2018

Вы можете никогда полностью избегать коллизий с хэш-кодами (за исключением типов, которые имеют менее 2 ^ 32 возможных различных значений, таких как шорты или байты или что-то в этом роде).Написание хорошего хэша просто означает минимизацию ваших коллизий настолько, насколько вы можете.Вы можете сделать это, приложив все усилия, чтобы гарантировать, что ваши хэш-коды (приблизительно) равномерно распределены по всему диапазону int.

Вы также можете попытаться избежать столкновения определенных значений, обычно используемых вместе (например, вы можете придумать алгоритм генерации для дат, чтобы даты на той же неделе не конфликтовали, и чтобы все коллизии были вкроме этих дат).

Но каждый раз, когда вы используете сгенерированные хэш-коды, вам нужен какой-то механизм для обработки коллизий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...