C# 使用MD5 ComputeHash时的ObjectDisposedException
我收到ObjectDisposedException:安全句柄已关闭 这是我的代码: 我正在尝试创建一个接口和实现类,该类将使我能够获取一个字符串,附加一个已知的键,计算该字符串和键的MD5哈希,并返回计算出的哈希:C# 使用MD5 ComputeHash时的ObjectDisposedException,c#,hash,cryptography,md5,cryptographic-hash-function,C#,Hash,Cryptography,Md5,Cryptographic Hash Function,我收到ObjectDisposedException:安全句柄已关闭 这是我的代码: 我正在尝试创建一个接口和实现类,该类将使我能够获取一个字符串,附加一个已知的键,计算该字符串和键的MD5哈希,并返回计算出的哈希: public interface ISignService { string GetSignature(string str); } public class SignService : ISignService { private readonly ISignS
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();
}
}
谢谢代码似乎工作正常。问题可能是:
MDS.Create()
移动到内部GetSignature()
SignService
还是\u hashAlgo
)?
如果是,请不要在需要时处置或重新创建您的代码不是线程安全的<代码>\u hashAlgo不能在线程之间共享。请注意,您看到的异常并不是唯一可能导致的问题;我相信这个问题也会导致不正确的散列值。每次都需要创建一个新的
HashAlgorithm
对象,或者查看线程局部变量,以便为每个线程创建一个实例。哪行代码引发异常?hashed.tohextString()
是扩展方法吗?我粘贴了你的代码,但是这个方法不存在……嗨,这是一个扩展方法。抛出的行是:var hashed=_hashAlgo.ComputeHash(Encoding.UTF8.GetBytes(strWithKey));你的代码可以工作。问题应该在你向我们展示的以外。很可能,\u hashAlgo
会在某个时候被释放……这几乎肯定是一个多线程问题,这将导致此异常。请参阅的答案。这很可能是正确的答案。看看答案。对同一HashAlgorithm
子类实例上的实例方法的并发访问将导致此异常。该问题还可能导致不正确的哈希值
——这是正确的。不久前我遇到并解决了同样的问题。