gpt4 book ai didi

c# - GetHashCode 应该取决于类型吗?

转载 作者:行者123 更新时间:2023-11-30 14:16:34 25 4
gpt4 key购买 nike

首先,我使用 GetHashCode算法描述,here .现在,想象以下(人为的)示例:

class Foo
{
public Foo(int intValue, double doubleValue)
{
this.IntValue = intValue;
this.DoubleValue = doubleValue;
}

public int IntValue { get; private set; }
public double DoubleValue { get; private set; }

public override int GetHashCode()
{
unchecked
{
int hash = 17;

hash = hash * 23 + IntValue.GetHashCode();
hash = hash * 23 + DoubleValue.GetHashCode();
return hash;
}

}
}

class DerivedFoo : Foo
{
public DerivedFoo(int intValue, double doubleValue)
: base(intValue, doubleValue)
{

}
}

如果我有一个 Foo和一个 DerivedFoo每个属性的值都相同,它们将具有相同的哈希码。这意味着我可以拥有 HashSet<Foo>或使用 Distinct Linq 中的方法,这两个实例将被视为相同。

我可能只是误解了 GetHashCode 的用法但我希望这两个实例具有不同的哈希码。这是一个无效的期望还是应该 GetHashCode在计算中使用类型? (或者 DerivedClass 也应该覆盖 GetHashCode )?

附言我知道有很多很多关于 SO 的问题与这个主题相关,但我还没有发现一个可以直接回答这个问题的问题。

最佳答案

GetHashCode() 不应该保证唯一性(尽管如果尽可能唯一,它有助于提高性能)。

GetHashCode() 的主要规则是等效对象必须具有相同的哈希码,但这并不意味着非等效对象可以' t 具有相同的哈希码。

如果两个对象具有相同的哈希码,则调用Equals() 方法来查看它们是否相同。由于类型不同(当然取决于您对 Equals 重载的编码方式)它们将不相等,因此没问题。

即使如果您对每种类型有不同的哈希码算法,仍然总是有可能发生冲突,因此也需要Equals() 检查.

现在给出上面的示例,您没有实现 Equals() 这将使每个对象都不同,而不管哈希码如何,因为 Equals() 的默认实现来自object 是引用相等性检查。

如果您还没有,请继续为您的每个类型覆盖 Equals()(如果您愿意,它们可以继承您的 GetHashCode() 实现,或者有新的),在那里你可以确保比较对象的类型在声明它们相等之前是相同的。并确保始终执行 Equals()GetHashCode(),以便:

  • Equals() 的对象必须 具有相同的GetHashCode() 结果。
  • 具有不同GetHashCode()的对象必须Equals()

关于c# - GetHashCode 应该取决于类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7349599/

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