gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:44:37 25 4
gpt4 key购买 nike

我只是在看 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需要调整大小呢?为什么选择这个素数?

最佳答案

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

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

关于c# - .NET ConcurrentDictionary 初始容量设置为任意质数,而不是 MSDN 示例文档中的预期容量。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4181531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com