【发布时间】:2011-03-24 07:51:37
【问题描述】:
在我的应用程序中,我需要计算给定 .NET 程序集和给定类型的哈希值。 在这种情况下,要散列的程序集和类型是动态加载的。
Object 的内置方法 GetHashCode 在每次启动应用程序时返回不同的值。
如何计算程序集或类型的确定性哈希函数?
任何帮助将不胜感激。
【问题讨论】:
标签: .net hash assemblies types hashcode
在我的应用程序中,我需要计算给定 .NET 程序集和给定类型的哈希值。 在这种情况下,要散列的程序集和类型是动态加载的。
Object 的内置方法 GetHashCode 在每次启动应用程序时返回不同的值。
如何计算程序集或类型的确定性哈希函数?
任何帮助将不胜感激。
【问题讨论】:
标签: .net hash assemblies types hashcode
这取决于你在寻找什么样的平等,真的:
您可能发现只需散列程序集(或类型)的全名就足够了......但我们需要了解更多关于您的要求才能确定。
编辑:回复您的评论(最初是在评论中,但后来太长了):
好的,这有点棘手......一个程序集文件包含一些在每次构建时都会更改的内容(可能是构建日期,也可能是随机 GUID;我已经调查过一段时间了)。你会想把这些数据扔掉。
如果您也只对程序集的 签名 感兴趣,则可以遍历所有公共类型(按字典顺序),然后获取这些类型的哈希并将它们组合起来。对于每个散列,您将获得所有公共成员(也可能是受保护的成员?)并对签名进行散列 - 例如通过组合返回类型、成员名称和参数的全名的哈希。对于每个参数,您希望包括类型,可能是名称,以及它的引用/输出状态。如您所见,它变得相当复杂:)
要组合多个哈希(因为这显然会涉及到某个地方:) 我倾向于使用这样的东西:
int hash = 17;
hash = hash * 31 + FirstHash();
hash = hash * 31 + SecondHash();
hash = hash * 31 + ThirdHash();
// etc
return hash;
【讨论】:
考虑在程序集名称或类型的程序集限定名称上调用 GetHashCode()。这应该在您的应用程序的执行之间更加一致。
【讨论】: