C# 使用MD5 ComputeHash时的ObjectDisposedException

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

我收到ObjectDisposedException:安全句柄已关闭

这是我的代码:

我正在尝试创建一个接口和实现类,该类将使我能够获取一个字符串,附加一个已知的键,计算该字符串和键的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();
    }
}

谢谢

代码似乎工作正常。问题可能是:

  • 是否在构造之间序列化和反序列化对象 和使用?如果是,请将
    MDS.Create()
    移动到内部
    GetSignature()
  • 是否正在处理对象(无论是
    SignService
    还是
    \u hashAlgo
    )? 如果是,请不要在需要时处置或重新创建

  • 您的代码不是线程安全的<代码>\u hashAlgo不能在线程之间共享。请注意,您看到的异常并不是唯一可能导致的问题;我相信这个问题也会导致不正确的散列值。每次都需要创建一个新的
    HashAlgorithm
    对象,或者查看线程局部变量,以便为每个线程创建一个实例。

    哪行代码引发异常?
    hashed.tohextString()
    是扩展方法吗?我粘贴了你的代码,但是这个方法不存在……嗨,这是一个扩展方法。抛出的行是:var hashed=_hashAlgo.ComputeHash(Encoding.UTF8.GetBytes(strWithKey));你的代码可以工作。问题应该在你向我们展示的以外。很可能,
    \u hashAlgo
    会在某个时候被释放……这几乎肯定是一个多线程问题,这将导致此异常。请参阅的答案。这很可能是正确的答案。看看答案。对同一
    HashAlgorithm
    子类实例上的实例方法的并发访问将导致此异常。
    该问题还可能导致不正确的哈希值
    ——这是正确的。不久前我遇到并解决了同样的问题。