散列.NET程序集和类型

时间:2010-08-02 16:53:40

标签: .net hash assemblies types hashcode

在我的应用程序中,我需要计算给定.NET程序集和给定类型的哈希值。 要在此方案中动态加载要散列的程序集和类型。

Object的内置方法每次启动应用程序时,GetHashCode都会返回不同的值。

如何计算装配或类型的确定性散列函数?

非常感谢任何协助。

2 个答案:

答案 0 :(得分:2)

这取决于你正在寻找什么样的平等,真的:

  • 如果您在另一个位置有另一个程序集副本,是否应更改哈希?
  • 如果重建了相同的代码,是否应更改哈希?
  • 如果代码已更改且然后重建,是否应该更改哈希?

可能发现只需散列程序集(或类型)的全名就足够了......但我们需要了解更多关于你的要求的信息。

编辑:回复你的评论(最初是在评论中,但是时间太长了):

好的,这有点棘手......一个程序集文件包含一些在每个构建上都有变化的东西(可能是一个构建日期,可能是一个随机的GUID;自从我调查以来已经有一段时间了)。你想把这些数据扔掉。

如果您只对程序集的签名感兴趣,则可以迭代所有公共类型(按字典顺序排列),然后获取这些类型的哈希并将它们组合在一起。对于每个哈希,您将获得所有公共成员(也可能是受保护的成员?)并对签名进行哈希处理 - 例如通过组合返回类型,成员名称和参数的全名的哈希值。对于每个参数,您需要包括类型,可能包括名称以及它的引用/退出状态。如您所见,它变得非常复杂:)

结合多个哈希(因为这显然会涉及到某个地方:)我倾向于使用这样的东西:

int hash = 17;
hash = hash * 31 + FirstHash();
hash = hash * 31 + SecondHash();
hash = hash * 31 + ThirdHash();
// etc
return hash;

答案 1 :(得分:0)

考虑在程序集名称或类型的程序集限定名称上调用GetHashCode()。这应该在您的应用程序的执行之间更加一致。