如何确定缓存hashCode()结果是否合适?

时间:2011-08-02 06:46:29

标签: c# java performance hash theory

鉴于我有一个不可变类,其中已编写GetHashCode()函数,我如何知道缓存哈希结果是否有益,或者在大多数情况下这样做是否明智?< / p>

考虑到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 个答案:

答案 0 :(得分:4)

您的观点“1”仅定义何时应实施GetHashCode()(以及匹配的Equals) - 在这种情况下,您应该(“2”)期望查询适度次。但是,这里的关键是分析,或预先存在的场景知识。例如,如果您的哈希实际上是在大型内部数组上进行哈希,那么它可能值得缓存。在这种情况下,我会懒得缓存它(可能是int?),除非我知道用作键(总是),在这种情况下我可能会预先计算热切地说。

但在大多数情况下,每次都只需按需计算。