5

我有以下方法来生成对象的哈希。它工作得很好!但是当我更改程序集的版本时,即使对象相同,哈希也会发生变化。

public static string GetHash(Object item)
{
    MemoryStream memoryStream = new MemoryStream();
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(memoryStream, item);
    binaryFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple;

    HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider();
    memoryStream.Seek(0, SeekOrigin.Begin);

    return Convert.ToBase64String(hashAlgorithm.ComputeHash(memoryStream));
}

怎么可能忽略汇编版本?

4

2 回答 2

4

但是当我更改程序集的版本时,即使对象相同,哈希也会发生变化。

是的,这是使用时的预期行为BinaryFormatter......它不能保证创建相同的输出 -特别是因为它包含完整的类型信息(包括版本),所以几乎可以保证在版本之间进行更改。

我会考虑使用不包含类型信息的序列化程序;XmlSerializer,Json.NET 或 protobuf-net 会跃入脑海。

于 2013-10-10T08:47:50.740 回答
3

BinaryFormatter.AssemblyFormat记录为:

获取或设置反序列化程序在查找和加载程序集方面的行为。

没有迹象表明它对序列化路径有影响。

就我个人而言,我会避免这种散列方法——它对我来说似乎非常脆弱。您是否无法控制被散列的对象,或者任何更稳定的散列方式?

于 2013-10-10T07:49:13.757 回答