Есть только один способ удовлетворить требования GetHashCode
с Equals
, подобным этому.
Скажем, у вас есть эти объекты (стрелки показывают пределы допуска, а я упрощаю это до 1-D):
a c
<----|----> <----|---->
<----|---->
b
По вашей реализации Equals
мы имеем:
a.Equals(b) == true
b.Equals(c) == true
a.Equals(c) == false
(упоминается потеря транзитивности ...)
Однако, требования GetHashCode
состоят в том, что Equals
, будучи истинным, подразумевает, что хеш-коды одинаковы . Таким образом, имеем:
hash(a) = hash(b)
hash(b) = hash(c)
∴ hash(a) = hash(c)
Таким образом, мы можем покрыть любую часть одномерного пространства этим (представьте d
, e
, f
, ...), и все хэши должны быть одинаковыми!
int GetHashCode()
{
return some_constant_integer;
}
Я бы сказал, не беспокойтесь о .NET GetHashCode
. Это не имеет смысла для вашего приложения. ;)
Если вам нужна какая-то форма хэша для быстрого поиска вашего типа данных, вы должны начать искать какой-то пространственный индекс .