gpt4 book ai didi

c# - 为什么在 GetHashCode 实现中使用初始素数?

转载 作者:行者123 更新时间:2023-11-30 16:43:00 28 4
gpt4 key购买 nike

查看What is the best algorithm for an overridden System.Object.GetHashCode?我感到震惊的是,在许多建议哈希码类型为 hash = hash*(prime) + item.GetHashcode() 的答案中,哈希值最初被植入到另一个素数而不是 0。

我理解计算部分中素数的原因 互素数在很多方面都很有用。

我不明白的是为什么首先将散列初始化为非零数字。

看具体的例子:

int hash = 17;
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;

为了简写,我们让 field1.GetHashCode() 用 f1 表示(其他的以此类推)和初始哈希值 i 然后给出:

int hash = i;
hash = i * 23 + f1;
hash = (i * 23 + f1)* 23 + f2;
hash = ((i * 23 + f1)* 23 + f2)* 23 + f3;

展开最后一行的括号:

hash = (i*23*23 + f1*23 + f2)* 23 + f3;
hash = i*23*23*23 + f1*23*23 + f2*23 + f3;

正如我们所见,初始哈希值的唯一作用是将最终 has 值增加一个常量值 i*23*23*23,这将概括为 i*23^(字段数)。

那么这有什么帮助呢?如果 f1、f2、f3 都为 0,如果最终哈希为 0,是否有问题?它是非零的更好吗?我唯一的想法是,出于某种原因,使用哈希值的字典或哈希集等事物的实现更喜欢非零值,但我想不出那个原因可能是什么。或者其他当然这些东西有点神秘,所以人们使用经过试验和测试的东西,所以即使没有理由传播初始值。

我尝试查找一些 Microsoft 哈希码,但我发现的那些都使用外部代码来计算它们(对象、字符串)或者有些特殊(匿名对象上的 GetHashCode 实现根据对象的属性名称播种哈希码)匿名对象是不同的,因为它不是一个常量初始值)。

总而言之,为什么在哈希码实现中使用初始常量值?

编辑:Why use a prime number in hashCode?被建议为重复项,该网站希望我编辑我的问题以解释为什么它不是重复项......我已经承认在计算中使用素数作为乘数,我理解为什么会这样。这个问题明确是关于在哈希码算法中用作初始种子的。建议的副本没有明确说明素数的用途,但答案都解决了将其用作与该问题无关的乘数的问题。

最佳答案

这个问题有some good answers on the Computer Science SE .简而言之:初始常量改编自可以接受可变数量输入的哈希,你是对的,在那个例子中它并不重要。

关于c# - 为什么在 GetHashCode 实现中使用初始素数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45754687/

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