Как реализовать GetHashCode() в структуре C#
У меня есть структура, которая переопределяет Equals()
метод и компилятор жалуется на GetHashCode()
не переопределяется.
Моя структура:
private struct Key
{
...
public override int GetHashCode()
{
return ?;
}
public int FolderID;
public MyEnum SubItemKind;
public int SubItemID;
}
Как правильно реализовать GetHashCode()
метод?
а)
return FolderID ^ SubItemKind.GetHashCode() ^ SubItemID;
или б)
return FolderID.GetHashCode() ^ SubItemKind.GetHashCode() ^ SubItemID.GetHashCode();
1 ответ
Решение
Всегда последний. Первого недостаточно, потому что большинство битов равны 0 (ваши числа, скорее всего, малы), а эти нули в старших разрядах. Вы будете тратить много хеш-кода, таким образом получая намного больше коллизий.
Другой распространенный способ сделать это - умножить каждый элемент на простое число и полагаться на переполнения:
return unchecked(FolderID.GetHashCode() * 23 * 23
+ SubItemKind.GetHashCode() * 23
+ SubItemID.GetHashCode());
Изменить: обновлен для использования unchecked
для явной поддержки переполнения согласно комментарию Stakx.