【问题标题】:Hash of .NET assembly and type.NET 程序集和类型的哈希
【发布时间】:2011-03-24 07:51:37
【问题描述】:

在我的应用程序中,我需要计算给定 .NET 程序集和给定类型的哈希值。 在这种情况下,要散列的程序集和类型是动态加载的。

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

如何计算程序集或类型的确定性哈希函数?

任何帮助将不胜感激。

【问题讨论】:

    标签: .net hash assemblies types hashcode


    【解决方案1】:

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

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

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

    编辑:回复您的评论(最初是在评论中,但后来太长了):

    好的,这有点棘手......一个程序集文件包含一些在每次构建时都会更改的内容(可能是构建日期,也可能是随机 GUID;我已经调查过一段时间了)。你会想把这些数据扔掉。

    如果您也只对程序集的 签名 感兴趣,则可以遍历所有公共类型(按字典顺序),然​​后获取这些类型的哈希并将它们组合起来。对于每个散列,您将获得所有公共成员(也可能是受保护的成员?)并对签名进行散列 - 例如通过组合返回类型、成员名称和参数的全名的哈希。对于每个参数,您希望包括类型,可能是名称,以及它的引用/输出状态。如您所见,它变得相当复杂:)

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

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

    【讨论】:

    • 1.不同位置的程序集的精确副本应具有与原始程序集相同的哈希值。 2. 如果重建相同的代码,我希望哈希保持不变。 3. 是的,如果代码被更改然后重建,我希望哈希值不同,至少在汇编的情况下。使用类型的哈希,我可以接受仅更改方法的主体(并保持所有签名不变)不会更改哈希。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      相关资源
      最近更新 更多