我创建了自己的序列化形式,它将提供的对象转换为字符串,然后我可以获得 MD5 哈希。散列用于快速比较以查看特定属性是否已更改。但是我的代码非常慢,我想知道是否有人有更好的想法?
我只需要担心标有自定义 [DatabaseMap] 属性的对象中的属性。我不太关心散列方法,而是对象在散列之前序列化的方式。
有没有更好的方法来做到这一点?
public static string GetHash(this IBaseObject source)
{
if (source == null)
return string.Empty;
// step 1, calculate MD5 hash from input
var hasher = new ThreadLocal<MD5>(MD5.Create);
byte[] inputBytes = Encoding.UTF8.GetBytes(SerializeDataMembers(source, hasher)); // serialize the object
byte[] hash = hasher.Value.ComputeHash(inputBytes);
// step 2, convert byte array to hex string
// StringBuilder sb = new StringBuilder();
// for (int i = 0; i < hash.Length; i++)
// {
// sb.Append(hash[i].ToString("X2"));
// }
// return sb.ToString();
return BitConverter.ToString(hash);
}
private static string SerializeDataMembers(IBaseObject source, MD5 hasher)
{
StringBuilder sb = new StringBuilder();
var properties = source.GetType().GetProperties();
foreach (PropertyInfo prop in properties)
{
var attrs = Attribute.GetCustomAttributes(prop);
if (attrs.OfType<DatabaseMap>().Any())
{
if (prop.PropertyType == typeof (byte[]))
{
sb.Append(Convert.ToBase64String(hasher.ComputeHash((byte[])prop.GetValue(source))));
}
else
{
sb.Append(prop.GetValue(source));
}
}
}
return sb.ToString();
}