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

标签 c# hash reference equals gethashcode

伙计们,这是一个棘手的问题!

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

它们的相等性和哈希码必须基于对象的实例,这意味着引用相等而不是值相等。挑战在于系统中的某些对象已覆盖 Equals() 和 GetHashCode() 以用作值相等,并且它们的内部值会随时间变化。这意味着它们的 Equals 和 GetHashCode 是无用的。如何通用而非侵入性地解决此问题?

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

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

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

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

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

真诚的, 韦恩

最佳答案

RuntimeHelpers.GetHashCode()做的正是这里需要的。

关于C# 如何根据对象引用计算哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2944777/

相关文章:

c# - 创建新的 XML 元素

node.js - WooCommerce Webhooks Auth( secret 和签名)-如何使用

c++ - '&' 在类的一元运算符中意味着什么?

rust - 当方法需要值的所有权时,按值传递还是按引用传递更传统?

传递给构造函数的临时对象的 C++ 生命周期

C# 子类还是接口(interface)?

c# - SignalR 和 WinRT 客户端 : Don't call Wait() on Start()

mysql/文件哈希问题

c# - SQLite : how? 中的 SHA1 哈希

c# - Asp.net ConnectionString 以安全的方式