C# 我如何确定它是否';是否适合缓存hashCode()结果?
假设我有一个不可变的类,其中编写了一个C# 我如何确定它是否';是否适合缓存hashCode()结果?,c#,java,performance,hash,theory,C#,Java,Performance,Hash,Theory,假设我有一个不可变的类,其中编写了一个GetHashCode()函数,那么如何知道缓存哈希结果是否有益,或者在大多数情况下,这样做是否明智 考虑到GetHashCode()计算的性能已经针对原语和字符串值进行了优化,这是我应该考虑的问题吗 我的一个典型的GetHashCode()可能如下所示: //C# public override int GetHashCode() { int hash = 13; hash = 13 * hash + IntValue; hash
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;
}
我对可能明智的情况的看法是:
GetHashCode()
(匹配的等于
)——在这种情况下,您应该(“2”)期望它被查询适度的次数。然而,这里的关键是分析,或者对场景已有的知识。例如,如果您的散列实际上是在一个大的数组上进行散列,那么它可能值得缓存。在这种情况下,我会延迟地缓存它(可能作为int?
),除非我知道它将被用作键(总是),在这种情况下,我可能会急切地预先计算它
不过,在大多数情况下,每次只需按需计算即可。当评测显示
GetHashCode
占用大量时间时。第1点)似乎无关紧要。点2)应该出现在探查器中。您可以使用int hash=IntValue简化第一行String.hashCode()已经被缓存,因此在本例中可能没有您想象的那么多价值。感谢各位的评论,我可能会先发制人地提出一个问题,希望同行对这个问题有所思考。谢谢Marc,我应该在提问之前对这个问题进行更多思考。在某些情况下,我缓存了一些可能具有不可变数组的内容,并按照您的建议使用int?
进行了缓存。