字典<,>大小,GetHashCode和Prime数字?

时间:2013-02-20 16:01:31

标签: c# .net math dictionary

我一直在阅读这个有趣的话题(IMO)。但我不完全理解一件事:

字典大小将其容量(加倍到最接近的素数)增加到素数(重新分配时): 因为:

int index = hashCode % [Dictionary Capacity];
  • 因此,我们可以看到[Dictionary Capacity]使用素数,因为他们的 GreatestCommonFactor 1。这个帮助避免碰撞。

另外

我见过许多实施GetHashCode()的示例:

以下是Jon Skeet的样本:

public override int GetHashCode()
{
    unchecked 
    {
        int hash = 17;
        // Suitable nullity checks etc, of course :)
        hash = hash * 23 + field1.GetHashCode();
        hash = hash * 23 + field2.GetHashCode();
        hash = hash * 23 + field3.GetHashCode();
        return hash;
    }
}

我不明白:

问题

  

质数是否使用两者Dictionary capacity   生成getHashCode

中的

因为在上面的代码中,返回值很可能是素数[如果我错了,请纠正我]因为

  • 乘以23
  • 为每个字段添加GetHashCode()值。

例如:(11,17,173是素数)

        int hash = 17;
        hash = hash * 23 + 11; //402
        hash = hash * 23 + 17; //9263
        hash = hash * 23 + 173 //213222
        return hash;

213222不是素数。

此外,没有任何数学规则可以说明:

(not a prime number) + (prime number) = (prime number)

,也不

(not a prime number) * (prime number) = (prime number)

,也不

(not a prime number) * (not a prime number) = (prime number)

我错过了什么?

1 个答案:

答案 0 :(得分:7)

GetHashCode的结果无关紧要(它根本不必是素数),只要两个被认为相等的对象的结果相同即可。但是,{em>很好(但不是必需的)让GetHashCode为两个被认为不同的对象(但仍然不一定是素数)返回不同的值。

给定两个数字 a b ,当你将它们相乘时,得到c = a * b。通常有多个不同的 a b 对提供相同的结果 c 。例如,6 * 2 = 12和4 * 3 = 12.但是,当 a prime 数字时,会有很少的对产生相同的结果。这对于不同对象的哈希码应该不同的属性很方便。

在字典中,同样的原则适用:根据哈希值将对象放入存储桶中。由于大多数整数不能很好地除以素数,因此您可以在桶中很好地传播对象。理想情况下,您只需要每个存储桶中的一个项目以获得最佳字典性能。


稍微偏离主题:蝉(这是一只昆虫)use prime numbers确定它们去了多少年后再次交配。由于这个交配周期是 prime 年数,因此交配的机会与其任何敌人的生命周期不断重合。