我已经阅读了很多关于这个有趣的话题(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)
那么我错过了什么?