代码之家  ›  专栏  ›  技术社区  ›  mgamer

.NET程序集和类型的哈希

  •  1
  • mgamer  · 技术社区  · 14 年前

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

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

    任何协助都将不胜感激。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    14 年前

    这取决于你想要什么样的平等,真的:

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

    发现仅仅散列程序集(或类型)的全名就足够了。。。但我们需要更多地了解你的要求才能确定。

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

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

    签名 对于程序集,您也可以迭代所有公共类型(按字典顺序),然后获取这些类型的哈希并将它们组合起来。对于每个散列,您将获得所有公共成员(也可能是受保护的成员?)并对签名进行散列-例如,通过组合返回类型、成员名称和参数的全名的散列。对于每个参数,您都希望包含类型、名称以及它的ref/out状态。如你所见,事情变得相当复杂:)

    为了组合多个散列(因为这显然会涉及到:),我倾向于使用以下内容:

    int hash = 17;
    hash = hash * 31 + FirstHash();
    hash = hash * 31 + SecondHash();
    hash = hash * 31 + ThirdHash();
    // etc
    return hash;
    
        2
  •  0
  •   kbrimington    14 年前

    考虑打电话 GetHashCode()