Каким правилам я должен следовать, чтобы метод GetHashCode () возвращал уникальное значение для объекта? - PullRequest
0 голосов
/ 06 сентября 2011

Каким правилам я должен следовать, чтобы метод GetHashCode () возвращал уникальное значение для объекта?

Например:

  • Должен ли я включить в расчет некоторых членов Prive?
  • Должен ли я умножать вместо суммы?
  • Могу ли я быть уверен, что генерирую уникальный хеш-код для конкретного графа объектов? и т.д.

Ответы [ 3 ]

6 голосов
/ 06 сентября 2011

Вы не должны даже цель для GetHashCode(), возвращая уникальное значение для каждого объекта.Это не точка из GetHashCode().

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

Лично я склонен использовать реализацию, подобную этой:

public override int GetHashCode()
{
    int hash = 17;
    hash = hash * 31 + field1.GetHashCode();
    hash = hash * 31 + field2.GetHashCode();
    hash = hash * 31 + field3.GetHashCode();
    ...
    return hash;
}

На что следует обратить внимание:

  • Если выесть изменчивые объекты, будьте осторожны!Вы не должны мутировать объект после использования его в качестве ключа в хэш-карте.
  • Если ваши поля могут быть нулевыми, вы должны проверить это при вычислении хеша.Например:

    hash = hash * 31 + (field2 == null ? 0 : field2.GetHashCode());
    
1 голос
/ 06 сентября 2011

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

0 голосов
/ 06 сентября 2011

Я думаю, что ваш ответ здесь: см. Ответ Джона Скита, как правило, довольно надежный способ его расчета.Проверено временем:)

Каков наилучший алгоритм для переопределенного System.Object.GetHashCode?

...