为什么HashAlgorithm类实现了IDisposable接口?

4

在使用 MD5CryptoServiceProvider 时,我发现它可能需要被释放,因为它继承于实现了 IDisposableHashAlgorithm 类。然而,文档中的示例 没有对其进行释放。

我的问题是为什么 HashAlgorithm 类实现了 IDisposable?散列不只是在内存中进行的某些计算吗?散列过程中可能使用哪些非托管资源?

1个回答

5

您可以查看源代码

[System.Security.SecuritySafeCritical] // overrides public transparent member
protected override void Dispose(bool disposing)
{
    if (_safeHashHandle != null && !_safeHashHandle.IsClosed)
        _safeHashHandle.Dispose();
    base.Dispose(disposing);
}

这里正在处理内部的SafeHashHandle实例,它用于包装未经管理的资源(操作系统句柄),并从基类HashAlgorithm调用Dispose来释放。在使用后,您必须正确地处理和释放此句柄。

[System.Security.SecurityCritical]
protected override bool ReleaseHandle()
{
    FreeHash(handle);
    return true;
}

这个方法是基于SafeHandle类的抽象ReleaseHandle()方法的重写。你可以在MSDN上了解更多有关这个类的信息,基本上这个类是任何操作系统资源的包装器。

它包含一个关键终结器,确保句柄被关闭,并且保证在意外的AppDomain卸载期间运行,即使在假定平台调用是处于损坏状态的情况下也是如此。


谢谢你的回答,Pavel。但是你能告诉我需要哪个操作系统处理哈希吗? - KeyBored
另外,您认为文档中的示例是否应该处理 MD5CryptoServiceProvider 对象? - KeyBored
SafeHashHandle 是一个非托管句柄的示例,它是通过 P/Invoke 调用创建的,请查看 sources 中的以下方法。也许它不是操作系统句柄,而只是非托管引用,必须正确释放。 - Pavel Anikhouski
是的,我认为在文档中应该释放MD5CryptoServiceProvider,因为它正在释放由 _safeHashHandle 使用的托管资源(如果有的话)并调用基类 Dispose,如上面的示例所示。所有未受管的资源将由CLR释放,因为基本的 SafeHandle 有一个 Finalize 方法。 - Pavel Anikhouski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接