2012-08-31 17 views
5

私はObjectDisposedExceptionを取得しています:セーフハンドルが閉じられました。ObjectDisposedException MD5 ComputeHashを使用しているとき

これは私のコードです:私は、文字列を取得するために私を有効にするには、その知られているキーを添付し、この文字列とキーのMD5ハッシュを計算しますインタフェースと実装クラスを作成しようとしています

、およびコードが正常に動作するように見える

public interface ISignService 
{ 
    string GetSignature(string str); 
} 

public class SignService : ISignService 
{ 
    private readonly ISignSettings _signSettings; 
    private readonly HashAlgorithm _hashAlgo; 


    public SignService(ISignSettings signSettings) 
    { 
     _signSettings = signSettings; 
     _hashAlgo = MD5.Create(); 
    } 

    public string GetSignature(string str) 
    { 
     var strWithKey = str + _signSettings.EncryptionKey; 

     var hashed = _hashAlgo.ComputeHash(Encoding.UTF8.GetBytes(strWithKey)); 

     return hashed.ToHexString(); 
    } 
} 

おかげ

+2

どのコード行が例外をスローしますか? – ken2k

+0

'hashed.ToHexString()'は拡張メソッドですか?私はあなたのコードを貼り付け、そのメソッドは存在しません... – Laoujin

+0

こんにちは、それは拡張メソッドです。スローする行は次のとおりです。var hashed = _hashAlgo.ComputeHash(Encoding.UTF8.GetBytes(strWithKey)); – user1625867

答えて

1

:計算されたハッシュを返します。問題は:

  1. オブジェクトは、構成 とシリアル化されてシリアル化されていますか?使用していますか?その場合は、MDS.Create()を内部に移動してGetSignature()
  2. オブジェクトが廃棄されていますか(SignServiceまたは_hashAlgo)? もしそうなら、それを破棄したり、必要なときに再作成したりしないでください。
5

コードはスレッドセーフではありません。 _hashAlgoはスレッド間で共有できません。表示される例外は、唯一の問題ではないことに注意してください。私はこの問題も間違ったハッシュ値につながると信じています。新しいHashAlgorithmオブジェクトを毎回作成するか、スレッドローカルを調べてスレッドごとに1つのインスタンスを作成する必要があります。

+0

これは正解である可能性が最も高いです。 [ストレス下でのファイナライザの問題?](http://stackoverflow.com/a/26592826/1945631)の回答を参照してください。同じ 'HashAlgorithm'サブクラスインスタンス上のインスタンスメソッドへの同時アクセスはこの例外を引き起こします。 –

+1

'その問題も間違ったハッシュ値につながる可能性があります - これは本当です。私は直前に同じ問題に直面して解決しました。 – Denis

関連する問題