C#如何从对象引用计算哈希码

Way*_*yne 15 c# hash reference equals gethashcode

伙计们,这对你来说是一个棘手的问题!

TickZoom系统的一部分必须将每种类型对象的实例收集到Dictionary <>类型中.

它们的相等和哈希代码必须基于对象的实例,这意味着引用相等而不是值相等.挑战在于系统中的某些对象已重写Equals()和GetHashCode()以用作值相等,其内部值将随时间而变化.这意味着他们的Equals和GetHashCode是无用的.如何解决这个问题而不是侵扰性?

到目前为止,我们创建了一个结构来包装每个名为ObjectHandle的对象,以便散列到Dictionary中.如下所示,我们实现了Equals(),但仍然存在如何计算哈希码的问题.

public struct ObjectHandle : IEquatable<ObjectHandle>{
    public object Object;
    public bool Equals(ObjectHandle other) {
        return object.ReferenceEquals(this.Object,other.Object);
    }
}
Run Code Online (Sandbox Code Playgroud)

看到?有一个方法object.ReferenceEquals(),它将比较引用相等性,而不考虑对象中任何被重写的Equals()实现.

现在,如何通过仅考虑引用而不考虑任何重写的GetHashCode()方法来计算匹配的GetHashCode()?

啊,我希望这给你一个有趣的谜题.我们被困在这里.

真诚的,韦恩

Way*_*yne 20

RuntimeHelpers.GetHashCode()完全符合这里的要求.

  • 是的。它是恒定的。GC 保留对象的句柄。它的实际位置可以四处移动。所以它散列它的句柄。 (2认同)