Да.
Предположим, что Prop1, Prop2 и т. Д. Имеют тип int
.Обычно используется только нижний диапазон целых чисел.Ваш подход с суммой будет сталкиваться чаще, чем необходимо.
HasCode 7
равен 7, что имеет смысл при хешировании int
самостоятельно.Но с вашим кодом все кортежи <7, 3>
, <3, 7>
и <8, 2>
будут иметь одинаковый хэш.То же самое с простым XOR вместо сложения.
Обычный подход заключается в добавлении некоторых (простых) чисел и сдвига:
public int GetHashCode(MyType obj)
{
int hash = 0;
unchecked
{
hash += 19 * obj.Prop1.GetHashCode();
hash += 31 * obj.Prop2.GetHashCode();
hash += 37 * obj.Prop3.GetHashCode();
}
return hash;
}
Числа 19, 31, 37 не слишком критичны.И если вы предпочитаете, вы можете использовать ИЛИ или XOR вместо +
.