我一直在阅读这个有趣的话题(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)
我错过了什么?
答案 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 年数,因此交配的机会与其任何敌人的生命周期不断重合。