Как реализовать 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.

Другие вопросы по тегам