Вы не должны даже цель для 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());