gpt4 book ai didi

c# - c#如何计算出对象的哈希码?

转载 作者:可可西里 更新时间:2023-11-01 08:20:48 24 4
gpt4 key购买 nike

这个问题来自关于 tuples 的讨论。 .

我开始思考一个元组应该有的哈希码。如果我们将 KeyValuePair 类作为元组接受怎么办?它不会覆盖 GetHashCode() 方法,因此它可能不会知道它的“子代”的哈希码...因此,运行时将调用 Object.GetHashCode(),它不知道真实对象结构。

然后我们可以创建一些引用类型的两个实例,它们实际上是相等的,因为重载了 GetHashCode() 和 Equals()。并将它们作为元组中的“ child ”来“欺骗”字典。

但是没用!运行时以某种方式计算出我们元组的结构并调用我们类的重载 GetHashCode!

它是如何工作的? Object.GetHashCode() 做了什么分析?

当我们使用一些复杂的键时,它会影响某些糟糕情况下的性能吗? (可能,不可能的情况......但仍然)

以这段代码为例:

namespace csharp_tricks
{
class Program
{
class MyClass
{
int keyValue;
int someInfo;

public MyClass(int key, int info)
{
keyValue = key;
someInfo = info;
}

public override bool Equals(object obj)
{
MyClass other = obj as MyClass;
if (other == null) return false;

return keyValue.Equals(other.keyValue);
}

public override int GetHashCode()
{
return keyValue.GetHashCode();
}
}

static void Main(string[] args)
{
Dictionary<object, object> dict = new Dictionary<object, object>();

dict.Add(new KeyValuePair<MyClass,object>(new MyClass(1, 1), 1), 1);

//here we get the exception -- an item with the same key was already added
//but how did it figure out the hash code?
dict.Add(new KeyValuePair<MyClass,object>(new MyClass(1, 2), 1), 1);

return;
}
}
}

更新 我想我已经在我的回答中找到了对此的解释,如下所述。其主要成果有:

  • 小心您的 key 及其哈希码:-)
  • 对于复杂的字典键,您必须正确覆盖 Equals() 和 GetHashCode()。

最佳答案

不要在可变类上覆盖 GetHashcode() 和 Equals(),只在不可变类或结构上覆盖它,否则如果你修改用作键的对象,哈希表将不再正常运行(你不会能够在修改键对象后检索与键关联的值)

此外,哈希表不使用哈希码来标识对象,它们使用键对象本身作为标识符,不需要所有用于在哈希表中添加条目的键都返回不同的哈希码,但建议它们这样做,否则性能会受到很大影响。

关于c# - c#如何计算出对象的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/102690/

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