Вопрос о реализации GetHashCode - PullRequest
3 голосов
/ 05 февраля 2009

http://msdn.microsoft.com/en-us/library/system.object.gethashcode(VS.80).aspx говорит:

Для лучшей производительности хеш-функция должна генерировать случайное распределение для всех входных данных.

Влияет ли это на производительность или можно использовать функцию (например, return this.Id), которая не дает «случайного распределения», но не вызывает больше коллизий?

Ответы [ 5 ]

3 голосов
/ 05 февраля 2009

return this.Id обычно хорошо (особенно если Id является неизменным и уникальным) - основная идея состоит в том, чтобы избежать столкновений. Однако подумайте также об ожидающих данных - что такое Id из 27 строк, которые вы еще не сохранили?

Также обратите внимание, что реализации GetHashCode и Equals должны согласовываться .

1 голос
/ 05 февраля 2009

Использование this.Id в целом нормально. Основой является то, что вам не нужно слишком много коллизий, которые могли бы закончиться в одном сегменте . Номер сегмента обычно получают, взяв хеш-код и считая его «mod x», где x - количество сегментов в вашей хэш-таблице, и обычно он прост (или вероятен простым).

Если вы просто используете увеличивающиеся идентификаторы (1, 2, 3, 4 ...), то это в конечном итоге будет довольно случайным, если говорить о распределении сегментов. Только если ваш идентификатор следует шаблону, который может дать тот же номер корзины для множества записей, о которых вам следует беспокоиться.

0 голосов
/ 05 февраля 2009

Я предпочитаю использовать

this.Id.GetHashCode();

Я думаю, что это повышает вероятность того, что хэши будут распределяться правильно, а не использовать Id напрямую.

0 голосов
/ 05 февраля 2009

Это может повлиять, например, на. хеш-таблицы, которые хэшируются в сегменты в зависимости от старших битов (не часто). Кроме того, если ваши идентификаторы, например, все делятся на четыре, это может сделать хеш-таблицу, которая хэширует в сегмент hash_code%buckets, использовать только каждый четвертый сегмент.

0 голосов
/ 05 февраля 2009

Кажется плохо сформулированным ... Я думаю, что они означают, что хеш-коды должны быть "равномерно распределены" по всем возможным int значениям (эксперты .net исправьте меня, если я ошибаюсь), что поможет минимизировать столкновения.

Вот иллюстрация: предположим, что все мои хеш-коды были в диапазоне от 1 до 10. Если бы мне пришлось использовать хеш-код для вычисления индекса массива, где массив имеет длину 100, то я могу получить не более 10 различных индексов. Это означает, что мой массив плохо используется, и я получу много коллизий.

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