.NET ConcurrentDictionary初始容量设置为MSDN示例文档中的任意素数而不是预期容量.为什么?

Mat*_*ing 11 .net c# collections concurrency

我只是在查看ConcurrentDictionaryMSDN文档,我在"示例"代码中看到了这一点:

// 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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Vin*_*ayC 11

字典或散列表依赖于散列键来获取较小的索引以查找相应的存储(数组).因此,哈希函数的选择非常重要.典型的选择是获取密钥的哈希码(以便我们获得良好的随机分布),然后将代码除以素数,并使用提醒来索引固定数量的桶.这允许将任意大的哈希代码转换为有界的小数字集合,我们可以为其定义要查找的数组.因此,在素数中使用数组大小​​,然后对于大小的最佳选择,重要的是成为大于所需容量的素数.这正是字典实现的确如此.

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