提供されたオブジェクトを文字列に変換し、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();
}