GetType()是否有保证的唯一性.GetHashCode()?

时间:2015-10-19 11:53:37

标签: c# gethashcode gettype

我们说我有几节课:

MyClass1() {}

MyChild1() : MyClass1 {}

MyChild2() : MyClass2 {}

MyGrandchild1() : MyChild2 {}

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

(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(),是否有机会返回{{} 1}?

3 个答案:

答案 0 :(得分:3)

  

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

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

  

是否有可能:typeof(MyClass1).GetHashCode() == typeof(MyGrandchild1).GetHashCode()将返回true

  

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

不,它们是不同的类型

  

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

不,原因与上述相同。

答案 1 :(得分:2)

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

(2)否,因为System.Type具有正确实施的Equals方法。 Equals方法的目的不仅表示相等,而且在GetHashCode()产生碰撞时“打破平局”。

(3)否。见(2)。

答案 2 :(得分:1)

  1. GetHashCode返回一个整数,因此可以返回唯一值的限制。没有定义类型的限制,所以是的,typeof(MyClass1).GetHashCode() == typeof(MyGrandchild1).GetHashCode()可能会返回true
  2. 2,3。哈希代码从不用于检查相等性。哈希代码和相等之间的唯一关系是相等的对象应具有相同的哈希码。

    修改

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

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

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

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

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

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