【问题标题】:Is there a guranteed uniqueness for GetType().GetHashCode()?GetType().GetHashCode() 是否有保证的唯一性?
【发布时间】:2016-01-17 18:12:24
【问题描述】:

假设我有几个课程:

MyClass1() {}

MyChild1() : MyClass1 {}

MyChild2() : MyClass2 {}

MyGrandchild1() : MyChild2 {}

等等

我知道 GetHashCode() 本身,保证任何两个不同的对象之间的唯一性,但我感兴趣的是它适用于任何两个 类型 也是?即:

(1)是否有机会typeof(MyClass1).GetHashCode() == typeof(MyGrandchild1).GetHashCode() 将返回 true

(2) 如果 (1) 有机会:typeof(MyClass1) == typeof(MyGrandchild1) 是否有机会返回true

(3) 最坏的情况:typeof(int) == typeof(long) 是否有机会返回true

编辑我忘记询问案例(4) typeof(int).GetHashCode() == typeof(long).GetHashCode(),是否有机会返回true

【问题讨论】:

  • 1.是的; 2.没有; 3.没有
  • GetHashCode() 返回整数值。因此,可能的唯一值的数量有限。另一方面,您可以拥有的不同类型没有限制。所以答案是否定的,没有保证唯一性。不同类型的GetHashCode() 可能相同
  • @Fabjan 如果它只是(1)我同意它是一个完整的副本,但因为(2)和(3)也是问题的一部分,听起来 OP 在那里感到困惑类型的平等和他们的不平等,这使得这个问题不同恕我直言。
  • @SergeyBerezovskiy 所以只有大约 32k 个可能的唯一值。 int 不是 32 位类型吗?应该有 2^32 个可能的唯一值,而不仅仅是 32k(HashCode 允许为负数)。

标签: c# gethashcode gettype


【解决方案1】:

我知道 GetHashCode() 本身并不能保证任何两个不同对象之间的唯一性,但我感兴趣的是它是否也适用于任何两个类型

Type 是一个对象所以同样适用

有没有可能:typeof(MyClass1).GetHashCode() == typeof(MyGrandchild1).GetHashCode() 会返回 true

是的

如果 (1) 有机会:typeof(MyClass1) == typeof(MyGrandchild1) 是否有机会返回 true

不,它们是不同的类型

最坏的情况:typeof(int) == typeof(long)是否有可能返回true

不,原因同上。

【讨论】:

    【解决方案2】:

    (1) 是的,typeof(MyClass1).GetHashCode() == typeof(MyGrandchild1).GetHashCode() 有可能是 true。这应该是有意义的,因为 int 的可能值数量少于您可以定义的所有可能的类名。数学上肯定会有碰撞。

    (2) 不,因为System.Type 有一个正确实现的Equals 方法。 Equals 方法的目的不仅仅是表示相等,而是在GetHashCode() 产生冲突时“打破平局”。

    (3) 否。见 (2)。

    【讨论】:

    • (4) typeof(int).GetHashCode() == typeof(long).GetHashCode(),有没有机会返回true
    • @avance70 - 是的,但不太可能。这可能是对某人代码的重大更改,因此 Microsoft 不会这样做。
    • Type 没有定义任何特殊的GetHashCode 实现。它使用object.GetHashCode(),在每个实例上第一次调用它时返回一个伪随机数。所以很有可能这两个哈希码迟早会是一样的。
    • @JakubLortz - 这很有趣。我想这会很好,因为Equals 会处理罕见的决胜局案件。
    【解决方案3】:
    1. GetHashCode 返回一个整数,因此它可以返回的唯一值是有限的。定义的类型没有限制,所以是的,typeof(MyClass1).GetHashCode() == typeof(MyGrandchild1).GetHashCode() 有可能返回 true

    2,3。哈希码从不用于检查相等性。哈希码和相等之间的唯一关系是相等的对象应该具有相同的哈希码。

    编辑

    一个答案,加上一些解释。

    1. 类型实现引用相等。 CLR 确保实例是唯一的

    表示类型的 Type 对象是唯一的;也就是说,当且仅当它们表示相同的类型时,两个 Type 对象引用引用相同的对象。这允许使用引用相等来比较 Type 对象。

    这意味着Type 可以使用(确实如此)GetHashCode 的标准object 实现。当在每个实例上第一次调用此实现时,它会返回一个伪随机数。

    所以问typeof(int).GetHashCode()是否可以等于typeof(long).GetHashCode()基本上就是问两个伪随机数是否可以相等。是的,他们可以。

    如果您想了解有关object.GetHashCode() 实现的更多详细信息,请阅读this blog post

    【讨论】:

    • 不是用在任何类型的哈希表中吗,比如 Dictionary
    • @avance70 用于将项目分配给存储桶。如果您在MyClass 中将GetHashCode() 实现为return 1Dictionary<MyClass, SomeOtherClass> 仍然可以正常工作,但所有项目都将存储在一个存储桶中。只有性能会受到影响,因为现在检索项目将是 O(n) 而不是接近 O(1)。
    • 谢谢!那么(4)typeof(int).GetHashCode() == typeof(long).GetHashCode()呢,有没有机会返回true
    • @avance70 我刚刚在我的答案中添加了更多细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多