2009-04-17 3 views
5

オブジェクトは廃棄()メソッドを持っているが、それはプライベートです。その代わりに、Clear()メソッドがあります。このメソッドは、「すべてのリソースを解放します」メソッドを使用します。.NET:などMD5CryptoServiceProviderとしてHashAlgorithmから派生HashAlgorithmオブジェクトを配置すること

WTF?

これで、HashAlgorithmを正しく処分する方法はありますか?

var hasher = new MD5CryptoServiceProvider(); 

byte[] hashCode = hasher.ComputeHash(data); 

hasher.Clear(); 

誰かが私にこのことを説明しますか? :)

+0

私はあなたのように多くの人が考えることができれば、あなたも別のハッシュアルゴリズムを使用することをお勧めします特定のアプリケーションでMD5ハッシュが安全でない。良い選択肢は、SHA 256のようなSHAファミリです。これらは、.NETでの使用も可能です。 – Skurmedel

+0

よろしくお願いします。私はMD5が数年前に脆弱であることが判明したことを読んで覚えています。これはWikipediaのGeeze氏:「2006年3月18日、Klima氏は、ノートブックコンピュータで1分間にトンネリングと呼ばれる方法で衝突を検出できるアルゴリズム[10]を公開しました。 – core

答えて

3

Clearメソッドは、単にDispose専用メソッドを呼び出します。名前がClearのメソッドを公開する理由は、おそらく、クラスの設計者がハッシュアルゴリズムのより適切な名前であると思ったからです。 ()のように、BCLの他の部分でも同様のスタイルが表示されます。また、usingブロックを使用することをお勧めします。このブロックは、終了時に自動的にプライベートDisposeメソッドを呼び出します。

+0

を実装しない、それは試して、最終的には/あなたのためのロジックを配置を簡素化し、そして実践を推奨している、とにかく 'using'ブロックを使用するのが最善です何か新しいことを学ぶと思います。 – Noldorin

-4

あなたにはGCがそれを処理させるべきです。それが仕事です。

一部のリソースは、DB接続とファイルハンドルのように、処分され、そのusingブロック(C#の)中でそれらを配置する必要があります。しかし、これらのケースの1つではありません。

+0

実際、HashAlgorithm(したがってMD5CryptoServiceProvider)*はIDisposableを実装しているため、Clearメソッドを呼び出すか 'using'ブロックを使用して適切に処理する必要があります。 – Noldorin

+3

クラスがIDisposableを実装しているからといって、それを手動で処分する必要があるわけではありません。しかし、彼自身に、それぞれ。 –

+0

実際、IDisposableを実装しているという事実は、ほとんどの場合、ネイティブinterop内部を処理しているため、手動で処理する必要があることを強く示しています。明示的にメソッドを呼び出さなくても、GCは最終的に処分されますが、この時間は保証されません。 – Noldorin

10

Dipose()方法は、あなたがIDisposableにキャストした場合、あなたがそれにアクセスすることができ、プライベートですが。しかし、他の人が言ったように、Clear()はそれをあなたのために呼ぶでしょう。

より良いアプローチは、しかし、使用して()ブロック内で宣言と、変数の割り当てを囲むことである。

byte[] hashCode; 

using(var hasher = new MD5CryptoServiceProvider()) 
{ 
    hashCode = hasher.ComputeHash(data); 
} 
関連する問題