Как определить, целесообразно ли кэшировать результат hashCode ()?

Учитывая, что у меня есть неизменный класс, для которого была написана функция 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. Если на упомянутой карте будет много поисков за время ее существования.
4 голоса | спросил Brett Ryan 2 AM000000100000002931 2011, 10:46:29

1 ответ


0

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

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

ответил Marc Gravell 2 AM000000100000004331 2011, 10:56:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132