I have the following method to generate a hash of an object. It works pretty good! But when I change the version of the assembly, the hash is changing even when the object is the same.
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));
}
How is it possible to ignore the assembly version?
BinaryFormatter.AssemblyFormat
is documented as:
Gets or sets the behavior of the deserializer with regards to finding and loading assemblies.
There's no indication that it has an impact on the serializing path.
Personally I would avoid this method of hashing - it seems terribly fragile to me. Do you have no control over the object being hashed, or any way of hashing in a more stable way?
See more on this question at Stackoverflow