在我的应用程序中,我需要计算给定.NET程序集和给定类型的哈希值。 要在此方案中动态加载要散列的程序集和类型。
Object的内置方法每次启动应用程序时,GetHashCode都会返回不同的值。
如何计算装配或类型的确定性散列函数?
非常感谢任何协助。
答案 0 :(得分:2)
这取决于你正在寻找什么样的平等,真的:
你可能发现只需散列程序集(或类型)的全名就足够了......但我们需要了解更多关于你的要求的信息。
编辑:回复你的评论(最初是在评论中,但是时间太长了):
好的,这有点棘手......一个程序集文件包含一些在每个构建上都有变化的东西(可能是一个构建日期,可能是一个随机的GUID;自从我调查以来已经有一段时间了)。你想把这些数据扔掉。
如果您只对程序集的签名感兴趣,则可以迭代所有公共类型(按字典顺序排列),然后获取这些类型的哈希并将它们组合在一起。对于每个哈希,您将获得所有公共成员(也可能是受保护的成员?)并对签名进行哈希处理 - 例如通过组合返回类型,成员名称和参数的全名的哈希值。对于每个参数,您需要包括类型,可能包括名称以及它的引用/退出状态。如您所见,它变得非常复杂:)
结合多个哈希(因为这显然会涉及到某个地方:)我倾向于使用这样的东西:
int hash = 17;
hash = hash * 31 + FirstHash();
hash = hash * 31 + SecondHash();
hash = hash * 31 + ThirdHash();
// etc
return hash;
答案 1 :(得分:0)
考虑在程序集名称或类型的程序集限定名称上调用GetHashCode()
。这应该在您的应用程序的执行之间更加一致。