Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何确定它是否';是否适合缓存hashCode()结果?_C#_Java_Performance_Hash_Theory - Fatal编程技术网

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;
}
我对可能明智的情况的看法是:

  • 如果它是地图或字典的键
  • 如果所述映射在其生存期内将有许多查找
  • 您的点“1”只定义了何时应该实现
    GetHashCode()
    (匹配的
    等于
    )——在这种情况下,您应该(“2”)期望它被查询适度的次数。然而,这里的关键是分析,或者对场景已有的知识。例如,如果您的散列实际上是在一个大的数组上进行散列,那么它可能值得缓存。在这种情况下,我会延迟地缓存它(可能作为
    int?
    ),除非我知道它将被用作键(总是),在这种情况下,我可能会急切地预先计算它


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

    当评测显示
    GetHashCode
    占用大量时间时。第1点)似乎无关紧要。点2)应该出现在探查器中。您可以使用
    int hash=IntValue简化第一行String.hashCode()已经被缓存,因此在本例中可能没有您想象的那么多价值。感谢各位的评论,我可能会先发制人地提出一个问题,希望同行对这个问题有所思考。谢谢Marc,我应该在提问之前对这个问题进行更多思考。在某些情况下,我缓存了一些可能具有不可变数组的内容,并按照您的建议使用
    int?
    进行了缓存。