gpt4 book ai didi

c# - Object.GetHashCode() 对于引用或值是唯一的吗?

转载 作者:IT王子 更新时间:2023-10-29 04:24:11 27 4
gpt4 key购买 nike

有关 Object.GetHashCode() 的 MSDN 文档描述了关于该方法应该如何工作的 3 个相互矛盾的规则。

  1. 如果两个相同类型的对象表示相同的值,则哈希函数必须为任一对象返回相同的常量值。
  2. 为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
  3. 无论对对象进行任何更改,哈希函数都必须返回完全相同的值。

规则 1 和 3 与我矛盾。

Object.GetHashCode() 是否根据对象的 或对象的引用 返回一个唯一的数字。如果我覆盖该方法,我可以选择使用什么,但如果有人知道的话,我想知道内部使用了什么。

最佳答案

Rules 1 & 3 are contradictory to me.

在某种程度上,他们是。原因很简单:如果一个对象存储在哈希表中,并且通过更改它的值,您更改了它的哈希值,那么哈希表已经丢失了该值,您无法通过查询哈希表再次找到它。重要的是,当对象存储在哈希表中时,它们会保留其哈希值。

要实现这一点,通常最简单的方法是使可散列对象不可变,从而避免整个问题。然而,仅使确定哈希值的那些字段不可变就足够了。

考虑以下示例:

struct Person {
public readonly string FirstName;
public readonly string Name;
public readonly DateTime Birthday;

public int ShoeSize;
}

人们很少更改他们的生日,而且大多数人从不更改他们的名字(结婚时除外)。然而,他们的鞋码可能会任意变大,甚至变小。因此,使用生日和姓名而不是鞋码来识别人是合理的。哈希值应反射(reflect)这一点:

public int GetHashCode() {
return FirstName.GetHashCode() ^ Name.GetHashCode() ^ Birthday.GetHashCode();
}

关于c# - Object.GetHashCode() 对于引用或值是唯一的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34505/

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