我有以下方法来生成对象的散列。效果很好!但是,当我更改程序集的版本时,即使对象是相同的,哈希也在改变。
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));
}如何可能忽略程序集版本?
发布于 2013-10-10 08:47:50
但是,当我更改程序集的版本时,即使对象是相同的,哈希也在改变。
是的,这是预期的行为时使用BinaryFormatter.它不能保证创建相同的输出,特别是因为它包含完整的类型信息(包括版本),所以几乎可以保证在不同版本之间进行更改。
我会考虑使用不包含类型信息的序列化程序;XmlSerializer、Json.NET或protobuf会突然出现在我的脑海中。
发布于 2013-10-10 07:49:13
BinaryFormatter.AssemblyFormat被记录为:
获取或设置反序列化器在查找和加载程序集方面的行为。
没有迹象表明它对序列化路径有影响。
就我个人而言,我会避免这种散列的方法--对我来说,它似乎是非常脆弱的。您是否无法控制被散列的对象,或者以一种更稳定的方式进行散列?
https://stackoverflow.com/questions/19289898
复制相似问题