C# HashHelpers.GetPrime中此行的用途是什么?

C# HashHelpers.GetPrime中此行的用途是什么?,c#,.net,dictionary,C#,.net,Dictionary,我在.NET的字典实现中挖掘,发现了一个我很好奇的函数:HashHelpers.GetPrime 它所做的大部分工作都非常简单,它寻找一个高于某个最小值的素数,并将其作为参数传递给它,显然是为了在类似哈希表的结构中用作多个存储桶。但有一个神秘的部分: if (HashHelpers.IsPrime(j) && (j - 1) % 101 != 0) { return j; } (j-1)%101!=0检查?i、 e.为什么我们显然不想拥有比101的倍数多1倍的桶数?作者

我在.NET的字典实现中挖掘,发现了一个我很好奇的函数:
HashHelpers.GetPrime

它所做的大部分工作都非常简单,它寻找一个高于某个最小值的素数,并将其作为参数传递给它,显然是为了在类似哈希表的结构中用作多个存储桶。但有一个神秘的部分:

if (HashHelpers.IsPrime(j) && (j - 1) % 101 != 0)
{
    return j;
}
(j-1)%101!=0
检查?i、 e.为什么我们显然不想拥有比101的倍数多1倍的桶数?

作者解释得很好:

“InitHash”基本上是经典双哈希的一个实现 (见附件)

1) 唯一的“正确性”要求是“增量”用于 探针a。非零b。相对于桌子的大小来说是相对最好的 “hashSize”。(这是为了确保您能够探测数据库中的所有条目。) “包装”和访问条目之前的表(已探测)

2) 因为 我们选择表大小作为素数,我们只需要确保 增量为0 因此,这个函数可以工作:Incr=1+(seed%(hashSize-1))

虽然这对“均匀分布”的密钥很有效,但实际上, 不均匀性是常见的。特别是在实践中,我们可以看到 “基本上是连续的”,在这里你可以得到长串的“打包”键。 为了避免不良行为,您希望增量是 “大”即使是“小”值(因为小值往往会发生 在实践中更多)。因此,我们将“种子”乘以一个数字,这个数字将 这些较小的值更大(并且不会损害较大的值)我们选择了 HashPrime(101),因为它是prime,如果'hashSize-1'不是 HashPrime的倍数(在GetPrime中强制),则incr具有 可能是从1到hashSize-1的每个值。选择是 很大程度上是武断的。


有趣的问题,但可能是特定于要求作者回答的问题。您是否对其进行了反编译或下载了源代码?在查看GetPrime的源代码时,您是否尝试查看原始源代码而不是反编译的源代码?有很多注释可以帮助您理解此代码;)谢谢以上两条评论。看起来101实际上是一个名为HashTable.HashPrime的常量。还是不知道它的意义是什么!谢谢,正如人们所建议的那样,看起来转到源代码而不是反编译版本是正确的做法!是的!我有过几次在参考资料中记录奇怪行为的经历。干得好,MSFT。。