Хэширование в C#: обзор алгоритмов и примеры их использования на GetHashcode C
Метод GetHashCode() в C# - это метод, который возвращает хэш-код объекта. Хэш-код - это целочисленное значение, которое присваивается объекту и служит для определения его уникальности в коллекции или хэш-таблице.
Метод GetHashCode() является виртуальным методом класса Object, что означает, что любой класс, который не переопределяет этот метод, будет использовать его реализацию из класса Object. В реализации по умолчанию метод GetHashCode() возвращает уникальный идентификатор объекта, который может быть использован для сравнения объектов в коллекциях. Идентификатор объекта является уникальным только для объекта в рамках текущего запуска приложения.
Метод GetHashCode() можно переопределить в классе, чтобы обеспечить более эффективное хэширование объекта и улучшить производительность при работе с коллекциями.
Например, следующий код показывает, как переопределить метод GetHashCode() в классе Person:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override int GetHashCode()
{
unchecked // переполнение не проверяется
{
int hash = 17;
hash = hash * 23 + (Name != null ? Name.GetHashCode() : 0);
hash = hash * 23 + Age.GetHashCode();
return hash;
}
}
}
В этом примере метод GetHashCode() переопределен для класса Person. Он использует целочисленную переменную hash и умножение и сложение на простое число для генерации хэш-кода. Имя и возраст объекта Person используются для создания уникального хэш-кода, который будет использоваться при сравнении объектов Person в коллекциях.
Вот как можно использовать метод GetHashCode() для сравнения объектов:
Person person1 = new Person { Name = "John", Age = 30 };
Person person2 = new Person { Name = "John", Age = 30 };
Person person3 = new Person { Name = "Jane", Age = 25 };
Console.WriteLine(person1.GetHashCode()); // выводится уникальный хэш-код для первого объекта Person
Console.WriteLine(person2.GetHashCode()); // выводится тот же хэш-код, так как объекты равны
Console.WriteLine(person3.GetHashCode()); // выводится другой хэш-код, так как объекты не равны
if (person1.GetHashCode() == person2.GetHashCode())
{
Console.WriteLine("person1 and person2 are equals.");
}
if (person1.GetHashCode() != person3.GetHashCode())
{
Console.WriteLine("person1 and person3 are not equals.");
}
Когда вы переопределяете метод GetHashCode(), следует следующим образом писать выражение:
1. Создайте переменную типа int, назовите ее HashCode.
2. Заполните эту переменную начальным значением.
3. Перечислите свои свойства.
4. На каждой итерации, используйте равенство и тернарный оператор, чтобы проверить свойство на равенство с null, а затем вызвать GetHashCode на свойстве, если оно не null. Если свойство равно null, использование хэш-кода будет по умолчанию равно 0.
5. Верните значение HashCode.
Общая формула для хэширования выглядит следующим образом:
var hash = 17;
hash = hash * 23 + Property1.GetHashCode();
hash = hash * 23 + Property2.GetHashCode();
hash = hash * 23 + Property3.GetHashCode();
// и так далее
return hash;
Совет состоит в том, чтобы не использовать Mutable свойства, когда переопределяют GetHashCode(). Если используются свойства, которые могут измениться в течение времени жизни объекта, можно получить непредсказуемые результаты.