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

前端之家收集整理的这篇文章主要介绍了c# – .NET ConcurrentDictionary初始容量设置为MSDN示例文档中的任意素数而不是预期的容量.为什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我只是看着 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示例中的字典如下初始化:@H_502_5@

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的类似字典需要调整大小?为什么选择这个素数?@H_502_5@

解决方法

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

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

猜你在找的C#相关文章