Как определить, целесообразно ли кэшировать результат hashCode ()? - PullRequest
4 голосов
/ 02 августа 2011

Учитывая, что у меня есть неизменяемый класс, для которого была написана функция GetHashCode(), как я узнаю, будет ли полезно кэшировать результат хеширования, или в большинстве случаев даже целесообразно это сделать?

Учитывая, что производительность вычисления GetHashCode() была оптимизирована для примитивов и строковых значений, стоит ли задуматься над этим?

Типичный GetHashCode() мой может выглядеть следующим образом:

//C#
public override int GetHashCode() {
    int hash = 13;
    hash = 13 * hash + IntValue;
    hash = 13 * hash + (StringValue1 == null ? 0 : StringValue1.GetHashCode());
    hash = 13 * hash + (StringValue2 == null ? 0 : StringValue2.GetHashCode());
    return hash;
}

Мои мысли по поводу ситуаций, в которых это может быть целесообразно, следующие:

  1. Если это ключ к карте или словарю.
  2. Если у упомянутой карты будет много поисков за время ее существования.

1 Ответ

4 голосов
/ 02 августа 2011

Ваша точка "1" просто определяет, когда вы должны реализовать GetHashCode() (и соответствующий Equals) - и в таких сценариях вы должны ("2") ожидать, что он будет запрошен умеренный количество раз. Тем не менее, ключом здесь является профилирование или уже существующее знание сценария. Например, если ваш хеш фактически принимает хеш поверх внутреннего массива 1006 * с большим ишем, то, вероятно, его стоит кэшировать. В таких случаях я бы лениво кэшировал его (возможно, как int?), если только я не знаю, что будет использоваться в качестве ключа (всегда), и в этом случае я мог бы заранее рассчитать его.

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

...