Может ли пользовательская реализация GetHashcode вызывать проблемы с блоками Dictionary или Hashtable?

Я подумываю реализовать свой собственный хэш-код для данного объекта... и использовать его как key для моего словаря. Поскольку возможно (вероятно), что 2 объекта будут иметь одинаковый хэш-код, какие дополнительные операторы я должен переопределить и как это переопределение должно выглядеть (концептуально)?

   myDictionary.Add(myObj.GetHashCode(),myObj);

vs

   myDictionary.Add(myObj,myObj);

Другими словами, использует ли Словарь комбинацию следующих элементов, чтобы определить уникальность и в какую корзину поместить объект?

Какие важнее других?

  • Хэш-код
  • Равно
  • ==
  • По сравнению с()

Требуется ли compareTo только в SortedDictionary?


person halfbit    schedule 23.05.2012    source источник


Ответы (2)


Для чего используется GetHashCode?

По замыслу он полезен только для одного: помещения объекта в хеш-таблицу. Отсюда и название.

GetHashCode предназначен только для одной цели: сбалансировать хеш-таблицу. Не используйте его ни для чего другого. Особенно:

  • Он не предоставляет уникальный ключ для объекта; вероятность столкновения чрезвычайно высока.
  • Он не имеет криптографической стойкости, поэтому не используйте его как часть цифровой подписи или как эквивалент пароля.
  • Он не обязательно обладает свойствами обнаружения ошибок, необходимыми для контрольных сумм.

и так далее.

Эрик Липперт

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-getashcode/

person Jakub Konecki    schedule 23.05.2012

Проблема заключается не в корзинах, а в том, чтобы найти правильный экземпляр объекта после того, как вы определили корзину с помощью хэш-кода. Поскольку все объекты в корзине имеют один и тот же хеш-код, для поиска правильного используется равенство объектов (Equals). Правило состоит в том, что если два объекта считаются равными, они должны создавать один и тот же хеш-код, но два объекта, производящие одинаковые хеш-коды, могут не быть равными.

person BrokenGlass    schedule 23.05.2012