Вопрос функции С#.NET GetHashCode

Привет У меня есть класс с 6 строковыми свойствами. Уникальный объект будет иметь разные значения по крайней мере в одном из этих полей

Чтобы реализовать функцию IEqualityComparer GetHashCode, я конкатенирую все 6 свойств и вызывая GetHashCode в результирующей строке.

У меня были следующие сомнения:

  • Нужно ли вызывать GetHashcode по уникальному значению?
  • Будет ли операция конкатенации по шести свойствам замедлить сравнение?
  • Должен ли я использовать какой-то другой подход?

Ответ 1

GetHashCode не нужно возвращать неравные значения для "неравных" объектов. Ему нужно только вернуть равные значения для равных объектов (он также должен возвращать одинаковое значение для времени жизни объекта).

Это означает, что:

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

Если вы не можете одновременно удовлетворить обе точки, вы должны переоценить свой дизайн, потому что что-то еще оставит дверь открытой для ошибок.

Наконец, вы могли бы быстрее сделать GetHashCode, вызвав GetHashCode для каждой из 6 строк, а затем интегрируя все 6 результатов в одно значение, используя некоторые побитовые операции.

Ответ 2

Если ваши строковые поля имеют имя a-f и не имеют значения null, это предложение ReSharper для вашего GetHashCode()

public override int GetHashCode() {
  unchecked {
    int result=a.GetHashCode();
    result=(result*397)^b.GetHashCode();
    result=(result*397)^c.GetHashCode();
    result=(result*397)^d.GetHashCode();
    result=(result*397)^e.GetHashCode();
    result=(result*397)^f.GetHashCode();
    return result;
  }
}

Ответ 3

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

Сочетание строк - это один из параметров, но обратите внимание, что вы могли бы, например, объединить только две строки для хеш-кода (при сравнении всех строк на равных!).

Вы также можете комбинировать хэши шести отдельных строк, а не вычислять один хэш для комбинированной строки. См. Например Быстрые и простые комбинации хэш-кодов

Я не уверен, что это будет значительно быстрее, чем конкатенация строки.