我需要构建一个对象的稳定(= 不随时间变化)哈希码。具体来说,我不知道对象的确切类型。我做的唯一假设是它继承自 IStructuralEquatable。
所以我需要一个方法:
static string GetStableHashcode <T> (T object) where T: IStructuralEquatable
.Net 框架提供这种类型的功能?否则,使用哪种算法?
我需要构建一个对象的稳定(= 不随时间变化)哈希码。具体来说,我不知道对象的确切类型。我做的唯一假设是它继承自 IStructuralEquatable。
所以我需要一个方法:
static string GetStableHashcode <T> (T object) where T: IStructuralEquatable
.Net 框架提供这种类型的功能?否则,使用哪种算法?
无需在函数中使用泛型,因此您的问题是如何实现该方法
static string GetStableHashcode(IStructuralEquatable obj) { ... }
唯一明智的解决方案是像这样实现它:
static string GetStableHashcode(IStructuralEquatable obj) {
return obj.GetHashCode().ToString();
}
您的担忧是它Object.GetHashCode()
不提供稳定的值,并且该担忧非常有效,如文档中以Caution为标题的第一个框中所示:
不要序列化哈希码值或将它们存储在数据库中。
[...]
不要跨应用程序域或进程发送哈希码。在某些情况下,可以在每个进程或每个应用程序域的基础上计算哈希码。
实际上,由 创造的一些哈希码Object.GetHashCode
是稳定的Int32.GetHashCode
,String.GetHashCode
并且 使用的算法Tuple.GetHashCode
也会以“稳定的方式”组合哈希码。然而,这是一个实现细节,除非你想在你的代码中依赖它,否则你不能创建一个稳定的哈希码来提供一个实现的对象IStructuralEquatable
。
您的每个对象都应使用基于对象内容的哈希码。如果您有一个包含 3 个整数的值类型,请在计算哈希码时使用它们。
像这样,所有具有相同内容的对象都将具有相同的哈希码,与应用程序域和其他情况无关。
可以在此答案中找到一个良好哈希码的示例。