Sobes.tech
Назад к вопросам
Junior — Middle
58

В чем заключается роль метода GetHashCode при использовании словаря или хэш-коллекции?

Компании, где спрашивали
OZONOZON

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

GetHashCode нужен, чтобы быстро найти объект в словаре или другой хэш-коллекции по его хэш-коду. Он не обязан быть уникальным, но одинаковые объекты должны возвращать одинаковый хэш. Если Equals переопределён, GetHashCode тоже нужно согласовать с ним.

Определение:

GetHashCode возвращает целое число, которое используется хэш-коллекциями (Dictionary, HashSet, Lookup и т. п.) для быстрого распределения объектов по внутренним корзинам. Сначала коллекция сравнивает хэш-код, а уже потом при совпадении проверяет равенство через Equals. Это ускоряет поиск, вставку и удаление.

Пример использования:

using System;
using System.Collections.Generic;

public sealed class Person
{
    public string Name { get; }
    public int Age { get; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public override bool Equals(object? obj)
    {
        if (obj is not Person other) return false;
        return Name == other.Name && Age == other.Age;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Name, Age);
    }
}

var dict = new Dictionary<Person, string>();

var p1 = new Person("Ivan", 30);
var p2 = new Person("Ivan", 30);

dict[p1] = "Engineer";

Console.WriteLine(dict.ContainsKey(p2)); // True

Пояснение кода:

В примере два разных экземпляра Person считаются равными, потому что у них совпадают Name и Age.
Dictionary сначала вычисляет GetHashCode() для ключа и быстро находит нужную корзину.
Если хэш-коды совпали, коллекция дополнительно вызывает Equals, чтобы убедиться, что ключ действительно тот же.
Поэтому для p2 поиск проходит успешно, даже если это другой объект в памяти.

Ключевые моменты:

  • GetHashCode нужен для ускоренного поиска в хэш-коллекциях.
  • Одинаковые по Equals объекты обязаны иметь одинаковый хэш-код.
  • Разные объекты могут иметь одинаковый хэш-код — это называется коллизией.
  • GetHashCode и Equals нужно переопределять согласованно.
  • Нестабильный хэш-код у изменяемого объекта может ломать поведение Dictionary и HashSet.
  • Хэш-код помогает найти кандидатов, но финальное решение о равенстве принимает Equals.