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

我只是在查看ConcurrentDictionary的MSDN文档 ,我在“示例”代码中看到了这一点:

// 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 cd = new ConcurrentDictionary(Environment.ProcessorCount * 2, initialCapacity); for (int i = 0; i < NUMITEMS; i++) cd[i] = i * i; 

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

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

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