0

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

所以我需要一个方法:

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

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

4

2 回答 2

0

无需在函数中使用泛型,因此您的问题是如何实现该方法

static string GetStableHashcode(IStructuralEquatable obj) { ... }

唯一明智的解决方案是像这样实现它:

static string GetStableHashcode(IStructuralEquatable obj) {
  return obj.GetHashCode().ToString();
}

您的担忧是它Object.GetHashCode()不提供稳定的值,并且该担忧非常有效,如文档中以Caution为标题的第一个框中所示:

  • 不要序列化哈希码值或将它们存储在数据库中。

  • [...]

  • 不要跨应用程序域或进程发送哈希码。在某些情况下,可以在每个进程或每个应用程序域的基础上计算哈希码。

实际上,由 创造的一些哈希码Object.GetHashCode是稳定的Int32.GetHashCodeString.GetHashCode并且 使用的算法Tuple.GetHashCode也会以“稳定的方式”组合哈希码。然而,这是一个实现细节,除非你想在你的代码中依赖它,否则你不能创建一个稳定的哈希码来提供一个实现的对象IStructuralEquatable

于 2014-04-24T10:11:46.103 回答
0

您的每个对象都应使用基于对象内容的哈希码。如果您有一个包含 3 个整数的值类型,请在计算哈希码时使用它们。

像这样,所有具有相同内容的对象都将具有相同的哈希码,与应用程序域和其他情况无关。

可以在此答案中找到一个良好哈希码的示例。

于 2014-04-24T09:05:53.640 回答