2016-08-15 9 views
0

md5、sha1、sha512の3つの異なる方法があります。いくつかの小さな部分は、文を使用するのとは異なります。これらすべてのための汎用的なメソッドを作成することは可能ですか?私は中間者であり、いくつかの話題は私にとっては非常に新しいものです。 コードの下に(簡略化) "ConvertHashToString"メソッドは無視してください。 ありがとうございました!C#任意のアルゴリズムのための一般的な方法

public string CheckMd5(string filename) 
    { 
     using (var stream = File.OpenRead(filename)) 
     { 
      using (var md5 = MD5.Create()) 
      { 
       return ConvertHashToString(md5.ComputeHash(stream)); 
      } 
     } 

    } 

    public string CheckSha512(string filename) 
    { 
     using (var stream = File.OpenRead(filename)) 
     { 
      using (var sha = SHA512.Create()) 
      { 
       return ConvertHashToString(sha.ComputeHash(stream)); 
      } 
     } 
    } 

答えて

1

あなたは少し、このようにそれを簡素化することができます:あなたは、単一のメソッドをしたい場合は、アルゴリズムを指定するいくつかの方法が必要です

private string CheckHash(string filename, HashAlgorithm algorithm) 
{ 
    using (var stream = File.OpenRead(filename)) 
    { 
     using (algorithm) 
     { 
      return ConvertHashToString(algorithm.ComputeHash(stream)); 
     } 
    } 
} 

public string CheckMd5(string filename) => CheckHash(filename, MD5.Create()); 

public string CheckSha512(string filename) => CheckHash(filename, SHA512.Create()); 

CryptoConfig.CreateFromNameを使用して、文字列からハッシュインスタンスを作成することもできます。このような何か:

public string CheckHash(string filename, string algorithm) 
{ 
    using (var stream = File.OpenRead(filename)) 
    { 
     using (var algorithm = (HashAlgorithm)CryptoConfig.CreateFromName(algorithm)) 
     { 
      return ConvertHashToString(algorithm.ComputeHash(stream)); 
     } 
    } 
} 

おそらくCryptoConfig.CreateFromNameをキャストしようとする前にHashAlgorithmを返したことを検証します。

最後に、ジェネリックを使用できますが、これはファクトリメソッドを使用しません。ファクトリメソッドは.NET Coreのシナリオではうまく動作しますが、WinFormsを使用しているので、それは問題ではありません。このように使用することができ

public string Check<THash>(string filename) where THash:HashAlgorithm, new() 
{ 
    using (var stream = File.OpenRead(filename)) 
    { 
     using (var algorithm = new THash()) 
     { 
      return ConvertHashToString(algorithm.ComputeHash(stream)); 
     } 
    } 
} 

CheckHash<SHA512Managed>(file); 
+0

ありがとうございました!この方法の名前は何ですか?匿名の方法? – schui

+0

最初のものは、[expression body members](https://msdn.microsoft.com/en-us/magazine/dn802602.aspx)という新しいC#6構文です。 – vcsjones

+0

最初の実装は一般に悪い習慣です。オブジェクトは作成された場所に配置する必要があります。サンプルでは、​​完全に有効な 'MD5'オブジェクトを' CheckHash'に渡していますが、 'CheckHash'を呼び出すと、私の' MD5'オブジェクトは何らかの理由で破棄されています。もう一度使うつもりだったらどうしますか? 'CheckHash'については、このような動作を示すものはありません。 – dman2306

関連する問題