2012-08-31 45 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