C# System.Type的GetHashCode返回不同的值

C# System.Type的GetHashCode返回不同的值,c#,hash,types,gethashcode,C#,Hash,Types,Gethashcode,为什么GetHashCode为同一类型返回不同的值。如果我执行此代码: Console.WriteLine(typeof(Guid).GetHashCode()); 在不同的应用程序中,我得到不同的哈希代码 如果我在不同的应用程序中多次执行以下语句: Console.WriteLine("ABC".GetHashCode()); 我总是得到相同的哈希代码。但是为什么System.Type的哈希代码发生了变化,而System.String的哈希代码却没有变化 谢谢。无论是System.Stri

为什么
GetHashCode
为同一类型返回不同的值。如果我执行此代码:

Console.WriteLine(typeof(Guid).GetHashCode());
在不同的应用程序中,我得到不同的哈希代码

如果我在不同的应用程序中多次执行以下语句:

Console.WriteLine("ABC".GetHashCode());
我总是得到相同的哈希代码。但是为什么
System.Type
的哈希代码发生了变化,而
System.String的哈希代码却没有变化


谢谢。

无论是
System.String
还是
System.Type
都不保证将持久哈希代码作为其合同的一部分。在您的特定情况下,它恰好与
System.String
一起工作,这是一个无法依赖的实现细节。如果需要持久化或导出字符串哈希,请使用不同的字符串哈希方法。根据具体要求,持久化或导出有关类型的信息可能应该使用诸如
FullName
AssemblyQualifiedName
等信息。

无论是
System.String
还是
System.type
都不能保证将持久性哈希代码作为其契约的一部分。在您的特定情况下,它恰好与
System.String
一起工作,这是一个无法依赖的实现细节。如果需要持久化或导出字符串哈希,请使用不同的字符串哈希方法。根据具体要求,持久化或导出有关类型的信息可能应该使用诸如
FullName
AssemblyQualifiedName
等信息。

我猜这是因为类型指针的GetHashCode是指针值(RTTI地址)的散列,在不同的程序之间会有所不同。我猜这是因为类型指针的GetHashCode是指针值(RTTI的地址)的散列,在不同的程序之间会有所不同。我们希望使用GetHashCode来锁定数据库中的数据。锁的主键应该是对象的散列码及其主键(主键的散列码)。谢谢你的回答。@BendEg是的,这正是
GetHashCode
不能使用的方式。对于持久化或远程处理来说,它不能保证安全。它只能保证是同一台机器上、同一个应用程序实例中的哈希代码。更不用说哈希代码也不能保证是唯一的-唯一的保证是相等的对象也会有相等的哈希代码,但不是相反的。@Luaan这是一个非常好和重要的信息。比你强!Eric Lippert对如何(和不如何)使用
GetHashCode()
给出了一个很好的总结。我们希望使用GetHashCode来锁定数据库中的数据。锁的主键应该是对象的散列码及其主键(主键的散列码)。谢谢你的回答。@BendEg是的,这正是
GetHashCode
不能使用的方式。对于持久化或远程处理来说,它不能保证安全。它只能保证是同一台机器上、同一个应用程序实例中的哈希代码。更不用说哈希代码也不能保证是唯一的-唯一的保证是相等的对象也会有相等的哈希代码,但不是相反的。@Luaan这是一个非常好和重要的信息。比你强!Eric Lippert对如何(和不如何)使用
GetHashCode()
给出了一个很好的总结。