【问题标题】:.NET ConcurrentDictionary initial capacity set to arbitrary prime number rather than expected capacity in MSDN example documentation. Why?.NET ConcurrentDictionary 初始容量设置为任意素数,而不是 MSDN 示例文档中的预期容量。为什么?
【发布时间】:2011-05-10 01:16:56
【问题描述】:

我只是在看MSDN documentation for ConcurrentDictionary,我在“示例”代码中看到了这个:

// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
int NUMITEMS = 64;
int initialCapacity = 101;

作为参考,MSDN示例中的字典初始化如下:

ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(Environment.ProcessorCount * 2, initialCapacity);
for (int i = 0; i < NUMITEMS; i++) cd[i] = i * i;

在示例中,字典永远不会包含超过 64 个项目。为什么不将初始容量设置为 64,而不是设置为大于 64 的看似任意的素数?评论说这是为了确保字典在初始化时不需要调整大小,但是为什么需要调整 initialCapacity=64 的类似字典呢?为什么选择这个素数?

【问题讨论】:

    标签: c# .net collections concurrency


    【解决方案1】:

    字典或哈希表依赖于对键进行哈希处理以获得较小的索引来查找相应的存储(数组)。所以哈希函数的选择非常重要。典型的选择是获取一个键的哈希码(这样我们得到良好的随机分布),然后将代码除以一个素数,并使用提醒索引到固定数量的桶中。这允许将任意大的哈希码转换为一组有界的小数字,我们可以为其定义一个要查找的数组。因此,将数组大小设为素数很重要,然后大小的最佳选择成为大于所需容量的素数。这正是字典实现所做的。

    所以基本上任何 Modulo N(n 是素数)字典实现都需要它的容量是素数。因此,如果您说所需容量为 X,那么这些实现通常会选择比所需容量更大的引物数。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 2020-05-17
      • 2012-01-11
      • 2011-05-09
      • 2013-03-04
      相关资源
      最近更新 更多