我们说我有几节课:
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}?
答案 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)
GetHashCode
返回一个整数,因此可以返回唯一值的限制。没有定义类型的限制,所以是的,typeof(MyClass1).GetHashCode() == typeof(MyGrandchild1).GetHashCode()
可能会返回true
。2,3。哈希代码从不用于检查相等性。哈希代码和相等之间的唯一关系是相等的对象应具有相同的哈希码。
修改强>
还有一个答案,加上一些解释。
表示类型的Type对象是唯一的;也就是说,当且仅当它们表示相同类型时,两个Type对象引用引用同一对象。这允许使用引用相等性来比较Type对象。
这意味着Type
可以使用(并且确实)object
的标准GetHashCode
实现。当第一次在每个实例上调用时,此实现返回一个伪随机数。
因此,询问typeof(int).GetHashCode()
是否等于typeof(long).GetHashCode()
基本上是在询问两个伪随机数是否相等。是的,他们可以。
如果您想了解有关object.GetHashCode()
实施的更多详情,请阅读this blog post