/// <summary>
 /// 変更差分検知のためのデータのダイジェスト計算。
 /// ここでの実装はバイナリにシリアライズして MD5 をとる汎用実装だが、
 /// データがフラットな場合は以下のような実装に置き換えるやり方もある。
 /// こちらの方が処理は軽い(が、ハッシュの衝突リスクは上がる):
 /// <example>
 ///   return (
 ///     field1, field2, field3, ...
 ///   ).GetHashCode().ToString();
 /// </example>
 /// </summary>
 public virtual string GetCustomHash()
 {
     using (var memoryStream = new MemoryStream())
     {
         var formatter = new BinaryFormatter();
         formatter.Serialize(memoryStream, this);
         memoryStream.Position = 0;
         string hash = DigestUtil.GetMD5(memoryStream);
         _lastCalculatedHash = hash;
         Log($"Hash : {hash}");
         return(hash);
     }
 }
        //----------------------------------------------------------------------
        // private
        //----------------------------------------------------------------------

        static void SetUpAes(AesManaged aes, string key, string ivSeed)
        {
            aes.KeySize   = KeySize;
            aes.BlockSize = BlockSize;
            aes.Mode      = CipherMode.CBC;
            aes.Padding   = PaddingMode.PKCS7;

            string keyDigest = DigestUtil.GetMD5(key);
            string ivDigest  = DigestUtil.GetMD5AsBase64(ivSeed).Substring(0, BlockSize / 8);

            aes.Key = Encoding.UTF8.GetBytes(keyDigest);
            aes.IV  = Encoding.UTF8.GetBytes(ivDigest);
        }
 public virtual string SaveFileName()
 {
     return(DigestUtil.GetMD5(GetType().Name));
 }