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

C# .NET ConcurrentDictionary初始容量设置为任意素数,而不是MSDN示例文档中的预期容量。为什么?,c#,.net,collections,concurrency,C#,.net,Collections,Concurrency,我只是在看,我在“示例”代码中看到: 作为参考,MSDN示例中的字典初始化如下: ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(Environment.ProcessorCount * 2, initialCapacity); for (int i = 0; i < NUMITEMS; i++) cd[i] = i * i; ConcurrentDictionary c

我只是在看,我在“示例”代码中看到:

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

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

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

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

所以基本上,任何模N(N是素数)字典实现都需要它的容量是素数。所以,若你们说,所需的容量是X,那个么这些实现通常会选择下一个比所需容量更大的初始值

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