【问题标题】:Dictionary <,> Size , GetHashCode and Prime Numbers?字典 <,> 大小、GetHashCode 和素数?
【发布时间】:2013-02-20 16:01:31
【问题描述】:

我已经阅读了很多关于这个有趣的话题 (IMO) 的文章。但我不完全理解一件事:

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

int index = hashCode % [Dictionary Capacity];
  • 所以我们可以看到这里使用素数来表示[Dictionary Capacity],因为它们的GreatestCommonFactor1。这有助于避免碰撞。

另外

我见过很多实现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)

那么 什么 我错过了?

【问题讨论】:

标签: c# .net math dictionary


【解决方案1】:

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

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

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


有点题外话:蝉(那是一种昆虫)use prime numbers 来确定它们多少年后再次交配。由于这个交配周期是黄金年数,因此交配与其任何敌人的生命周期持续重合的可能性很小。

【讨论】:

  • @Virtlink: + 1 bit me on cicadas,不知道。完全脱离主题,但非常漂亮。已在 G+ 上发布。
  • @RoyiNamir:人类喜欢在他们的知识和周围的观察之间建立相似之处(例如丹布朗:达芬奇密码),但这实际上是自然 这导致我们得出这个结论。对不对,没人知道。
  • @Virtlink -(offtopic) 苍蝇不是最多活一周吗? 怎么进来的?
  • @RoyiNamir 显然这个物种(从技术上讲不是苍蝇)可以存活多年。但是不要问细节,我只在链接的文章中阅读过。我主要是人类,部分是程序员,当然不是昆虫学家。 :P
  • 您说:大多数整数不能很好地除以素数。我说:对于每个素数P,有相同或更少的整数可以被P+1“很好地除”。
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 2020-02-18
  • 2017-08-09
相关资源
最近更新 更多