0

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

1 に答える 1

0

Unit Of Workパターンは、私にアイ​​デアを与えてくれました。ハッシュを完全に削除し、関心のある特定の属性付きプロパティについて、セッターで古い値から新しい値に変更されているかどうかを比較し、変更されている場合はカウンターをインクリメントします。速度は、ハッシュなしで信じられないほど高速です。

    private void CompareChange<T>(T old, T newValue)
    {
        if (!EqualityComparer<T>.Default.Equals(old, newValue))
            Interlocked.Increment(ref _ChangeCount);
    }
于 2013-07-25T10:03:20.667 に答える