Вопрос о функции C # .NET GetHashCode - PullRequest
10 голосов
/ 05 сентября 2011

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

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

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

  1. Нужно ли вызывать GetHashcode для уникального значения?
  2. Замедлит ли операция объединения шести свойств сравнение?
  3. Должен ли я использовать какой-то другой подход?

Ответы [ 4 ]

4 голосов
/ 05 сентября 2011

Если ваши строковые поля названы af и известно, что они не равны 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 голосов
/ 05 сентября 2011

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

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

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

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

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

3 голосов
/ 05 сентября 2011

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

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

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

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

0 голосов
/ 06 сентября 2011

Вы можете использовать поведение из:

http://moh -abed.com / 2011/07/13 / entity-and-value-objects /

...