【问题标题】:How is hash implemented in .NET? [duplicate].NET 中如何实现哈希? [复制]
【发布时间】:2010-08-03 04:54:29
【问题描述】:

可能重复:
How does Object.GetHashCode work when the GC moves an object?

.NET 中的垃圾收集器移动对象,因此对象的地址不稳定。 Object的GetHashCode()方法是如何实现的?

谢谢!

【问题讨论】:

  • GetHashCode 方法与对象的位置无关。它也是一个虚方法,所以每种类型都可以根据需要定义。

标签: c# .net vb.net hashcode


【解决方案1】:

垃圾收集器为每个对象分配一个唯一的 ID,这是默认的 GetHashCode 实现使用的,而不是内存位置。

编辑实际上比这要复杂一些。不想误导任何人,所以你们应该更喜欢Jon Skeet's answer on the topic

【讨论】:

  • +1 为正确答案,以及您的链接 :)
  • 我认为该链接的信息不正确,至少在最新版本的 .NET 中没有。当我对一个对象调用 lock 时,我看到它的内存使用量增加了,这与它创建了一个同步块一致。但是当我调用 GetHashCode 时,我没有看到内存使用量有任何增加,所以我认为它不会创建同步块。
  • @fish:在我看来,这不是一种非常科学的测试方法。您怎么知道内存增加与同步块有关,而不是与您使用 Monitor.Enter 时 .NET 创建的任何其他内容有关?
  • @fish:在 .net 2.0 中,同步块字的含义发生了变化,因此它可以保存同步块索引或 GetHashCode 可用的不可变“对象标识符”(有一点可以识别所代表的内容)。如果同步块字包含同步块索引,则同步块内的字将包含上述对象标识符。
猜你喜欢
  • 2021-07-03
  • 2013-11-16
  • 2016-03-25
  • 2016-05-17
  • 2018-01-25
  • 2011-05-08
  • 2012-06-03
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多