2012-08-31 33 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對象,或者查看線程本地來爲每個線程創建一個實例。

+0

這很可能是正確的答案。請參閱[壓力下的終結者問題?]的答案(http://stackoverflow.com/a/26592826/1945631)。在同一個'HashAlgorithm'子類實例中併發訪問實例方法將導致此異常。 –

+1

'這個問題也可能導致不正確的哈希值 - 這是真的。前段時間我面臨並解決了同樣的問題。 – Denis

相關問題