GetHashCode

Метод предоставляет хеш-функцию для определенного типа данных.

Метод GetHashCode можно использовать в алгоритмах хеширования и таких структурах данных, как хеш-таблицы.

Метод GetHashCode по умолчанию не гарантирует уникальность возвращаемых для объекта значений. Следовательно, метод по умолчанию не следует использовать для хеширования в качестве уникального идентификатора объекта.

Хеш-функция используется для быстрого создания числа (хеш-кода), соответствующего значению объекта. Обычно каждому объекту Type соответствует своя хеш-функция, у которой в качестве входного аргумента должно использоваться хотя бы одно из полей экземпляра.

Хеш-функция обладает следующими свойствами:

  • если два объекта при сравнении оказались равны, методы GetHashCode обоих этих объектов возвращают одинаковые значения. Однако если при сравнении оказалось, что эти объекты не равны, методы GetHashCode этих объектов не обязательно должны возвращать разные значения;

  • метод GetHashCode последовательно возвращает для объекта один и тот же хеш-код, пока в состоянии объекта не произойдут изменения, определяющие значения, возвращаемые для объекта методом Equals. Это справедливо только для текущего выполнения клиентского приложения, и при повторном запуске приложения может возвращаться другой хеш-код;

  • значения хеш-функции подчиняются случайному распределению для всех входных аргументов.

Например, метод GetHashCode для класса String возвращает уникальные хеш-коды для уникальных строковых значений. Следовательно, два объекта String возвращают тот же хеш-код, если они представляют одно и то же строковое значение. Кроме того, этот метод использует все символы в строке для создания случайно распределенного результата, даже если входной параметр ограничен каким-либо диапазоном (например, многие пользователи применяют строки, содержащие только первые 128 символов набора ASCII, хотя строка может содержать любые из 65535 символов Юникода).

Предоставление хорошей хеш-функции для каждого класса может значительно ускорить добавление соответствующих объектов в хеш-таблицу. Поиск элементов в хеш-таблице при надлежащей реализации хеш-функции занимает постоянное время (например, операция O(1)). Скорость поиска элементов при плохой реализации хеш-функции зависит от числа элементов в хеш-таблице (например, O(n), где n – число элементов в хеш-таблице). Вычисление хеш-функций не отнимает значительного объема ресурсов.

Синтаксис
public virtual int GetHashCode();
Возвращаемое значение

Хеш-код для текущего объекта Object.

Исключения

Отсутствуют.

Пример
// C#
using System;
using System.Data;
using System.Data.Common;

class GetHashCodeSample
{
  static void Main()
  {
    // Создание фабрики классов провайдера
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД
    DbConnection con = factory.CreateConnection();
    con.ConnectionString =
      "User ID=SYSTEM;Password=MANAGER8";
    con.Open();
    // Создание объекта DbCommand
    DbCommand cmd = factory.CreateCommand();
    cmd.Connection = con;
    // Формирование текста SQL-запроса
    cmd.CommandText =
      "select NAME, FIRSTNAM from PERSON limit 2";
    // Выполнение SQL-запроса
    DbDataReader reader = cmd.ExecuteReader();
    // Обработка результатов запроса
    string value_name;
    string value_firstnam;
    int hash_code;
    while (reader.Read())
    {
      value_name = reader.GetString(0);
      value_firstnam = reader.GetString(1);
      hash_code = value_name.GetHashCode() + value_firstnam.GetHashCode();
      Console.WriteLine("Фамилия " + value_name +
        " имя " + value_firstnam + " хеш-код " + hash_code);
    }
    // Освобождение ресурсов
    reader.Dispose();
    cmd.Dispose();
    con.Dispose();
  }
}

Результат выполнения примера:

Фамилия QUIHLLAULT  имя CHARLES   хеш-код -558848851
Фамилия KIM         имя EDDIE     хеш-код 1246850474