【发布时间】:2013-02-20 16:01:31
【问题描述】:
我已经阅读了很多关于这个有趣的话题 (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中是否使用了质数both 和在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)
那么 什么 我错过了?
【问题讨论】:
-
你在哪里看到这个 GetHashCode 实现?
-
我从未在任何地方读到哈希码应该是素数,甚至最好是素数 - 它们应该尽可能均匀地分布在整个范围内。
-
查看 Eric Lippert 在stackoverflow.com/questions/5331842/…中的回答
-
@MiMo 感谢您的链接。
标签: c# .net math dictionary