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