C #: переопределить GetHashCode, что делает этот код? - PullRequest
2 голосов
/ 01 октября 2011

Вот код, который я нашел в Nhibernate 3 Beginners Guide для переопределения GetHashCode.Я не понимаю, почему он использует результат * 397. Если 397 просто случайное число, которое он использует для генерации уникального результата ??

Можем ли мы просто GetHashCode для имени, отчества и фамилии, а затем объединить его вместе^, он также должен генерировать уникальный результат.

public override int GetHashCode()
{
   unchecked
   {
       var result = FirstName.GetHashCode();
       result = (result*397) ^ (MiddleName != null ? MiddleName.GetHashCode() : 0);
       result = (result*397) ^ LastName.GetHashCode();
       return result;
   }
}

Ответы [ 2 ]

7 голосов
/ 01 октября 2011

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

Если вы только что сделали эксклюзив или для трех частей имени,тогда «Джон Уильям Джеймс» даст тот же хэш-код, что и «Джеймс Уильям Джон».

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

Переполнение является причиной, по которой этот код должен находиться внутри блока unchecked.

1 голос
/ 01 октября 2011

Умножение также является в основном сдвигом битов (в точности сдвигом битов, если * степень 2), так что здесь это влияет на вычисленное значение, но почему именно 397, то есть именно так был написан этот алгоритм патчи хеша,Да, другие значения, даже более сложные алгоритмы, часто используются в качестве алгоритма хеширования.

Это отличается от простого использования хеш-кодов XORing 3 и приведет к гораздо меньшему количеству «коллизий хеша» - где 2 (или больше)хеширует объекты до одного и того же значения (что-то должно быть сведено к минимуму, если этого не избежать в хорошей хэш-функции)

...