【问题标题】:GetHashCode of System.Type returns different valuesSystem.Type 的 GetHashCode 返回不同的值
【发布时间】:2015-10-20 14:06:13
【问题描述】:

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

Console.WriteLine(typeof(Guid).GetHashCode());

在不同的应用程序中,我得到不同的哈希码。

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

Console.WriteLine("ABC".GetHashCode());

我总是得到相同的哈希码。但是为什么System.Type的哈希码改变了,而System.String却没有?

谢谢。

【问题讨论】:

  • 我猜是因为类型指针的 GetHashCode 是指针值(RTTI 的地址)的哈希值,不同程序之间会有所不同。

标签: c# hash types gethashcode


【解决方案1】:

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

【讨论】:

  • 我们想使用GetHashCode 来锁定数据库中的数据。锁的主键应该是对象的哈希码和它的主键(主键的哈希码)。谢谢你的回答。
  • @BendEg 是的,这正是GetHashCode 不能使用的方式。不能保证持久性或远程处理的安全性。它只保证在同一台机器上,在同一个应用程序实例中是一个哈希码。更不用说哈希码无论如何都不能保证是唯一的 - 唯一的保证是相等的对象也将具有相等的哈希码,但不能相反。
  • @Luaan 这是一个非常好的和重要的信息。比你!
  • Here Eric Lippert 对如何(而不是)使用 GetHashCode() 进行了出色的总结。
猜你喜欢
  • 1970-01-01
  • 2016-04-10
  • 2022-11-29
  • 2017-03-29
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多