【问题标题】:How do I determine if it's appropriate to cache a hashCode() result?如何确定是否适合缓存 hashCode() 结果?
【发布时间】:2011-10-18 00:07:42
【问题描述】:

鉴于我有一个不可变类,其中编写了 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. 如果所述地图在其生命周期内将进行多次查找。

【问题讨论】:

  • 当分析显示GetHashCode 占用了大量时间。
  • 第 1 点)似乎无关紧要。点 2) 应在分析器中显示。
  • 您可以使用int hash = IntValue; String.hashCode() 在 Java 中简化第一行,因此在这种情况下可能没有您想象的那么多价值。
  • 谢谢你们的cmets,我可能先发制人地提出了这个问题,希望同行们对这个问题有想法。

标签: c# java performance hash theory


【解决方案1】:

您的点“1”仅定义了您应该何时实现GetHashCode()(以及匹配的Equals) - 在这种情况下,您应该(“2”)期望它被查询为中度 次数。然而,这里的关键是剖析,或预先存在的场景知识。例如,如果您的散列实际上是在一个大的内部 array 上进行散列,那么它可能值得缓存。在这种情况下,我会懒惰地缓存它(可能是int?),除非我知道它用作键(总是),在这种情况下我可能会急切地预先计算它.

不过,在大多数情况下,只需每次按需计算即可。

【讨论】:

  • 谢谢你,马克,我应该在提问之前多考虑一下这个问题。在某些情况下,我使用int? 缓存了一些可能具有不可变数组并按照您的建议完成的内容。
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 2012-06-14
  • 2012-10-20
  • 1970-01-01
  • 2012-07-29
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多