IStructuralEquatable对象的稳定哈希码

时间:2014-04-24 08:38:24

标签: .net hashcode structural-equality

我需要构建一个对象的稳定(=不随时间变化)哈希码。 具体来说,我不知道对象的确切类型。我做的唯一假设是它继承自IStructuralEquatable。

所以我需要一个方法:

static string GetStableHashcode <T> (T object) where T: IStructuralEquatable

.Net框架提供这种功能吗? 否则,使用哪种算法?

2 个答案:

答案 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.GetHashCodeString.GetHashCode一样稳定,Tuple.GetHashCode使用的算法也会将哈希码组合在一起。稳定的方式&#34;。但是,这是一个实现细节,除非您想在代码中依赖于此,否则无法创建稳定的哈希代码,而是提供实现IStructuralEquatable的对象。