.NET:处理HashAlgorithm对象

.NET:处理HashAlgorithm对象,.net,hashalgorithm,.net,Hashalgorithm,从HashAlgorithm派生的对象(如MD5CryptoServiceProvider)有一个Dispose()方法,但它是私有的。相反,它有一个Clear()方法,该方法“释放它使用的所有资源” WTF 这就是正确处理哈希算法的方法吗 var hasher = new MD5CryptoServiceProvider(); byte[] hashCode = hasher.ComputeHash(data); hasher.Clear(); 有人想给我解释一下吗?:) 您应该让GC为

从HashAlgorithm派生的对象(如MD5CryptoServiceProvider)有一个Dispose()方法,但它是私有的。相反,它有一个Clear()方法,该方法“释放它使用的所有资源”

WTF

这就是正确处理哈希算法的方法吗

var hasher = new MD5CryptoServiceProvider();

byte[] hashCode = hasher.ComputeHash(data);

hasher.Clear();

有人想给我解释一下吗?:)

您应该让GC为您处理。这就是我的工作


一些资源应该被处理掉,比如数据库连接和文件句柄,所以使用块(C#)将它们放在
中。不过,这并不是那种情况。

通过反射器查看,
HashAlgorithm
Clear
方法只调用private
Dispose
方法。公开名为
Clear
的方法的原因可能是类的设计者认为它更适合哈希算法。您可以在BCL的其他部分中看到类似的样式,例如
System.IO.Stream的
Close
。此外,这里的最佳实践是使用
using
块,它将在完成后自动调用private
Dispose
方法。

Dipose()
方法是private,如果将其强制转换为
IDisposable
,则可以访问它。正如其他人所说,
Clear()
将为您调用它

但是,更好的方法是将变量的声明和赋值包含在using()块中:


实际上,HashAlgorithm(因此MD5CryptoServiceProvider)确实实现了IDisposable,因此应该通过调用Clear方法或使用
块来正确处理它们。仅仅因为类实现了IDisposable,并不意味着需要手动处理它。但事实上,它确实实现了IDisposable,这几乎总是强烈地表明它应该被手动处理,因为它在内部执行一些本机互操作。即使您没有显式调用该方法,GC最终也会处理它,但不能保证发生这种情况的时间是确定的soon@Alex:事实上,这是100%不正确的。如果它实现了IDisposable,则始终应显式调用Dispose()。虽然好的设计会说,如果代码中的错误失败,类的终结器应该调用Dispose(),但从技术上讲,这并不需要什么。如果它实现了IDisposable,则调用Dispose()。HashAlgorithm确实实现了其他人提到的IDisposables,最好还是使用
using
块,这简化了try finally/Dispose逻辑,是推荐的做法。另外,请注意,反射还表明Dispose方法只是将内部数组归零。它甚至没有释放数组(没有设置为null),也没有释放其调用的array.Clear。它似乎不执行任何句柄或其他对象的非托管释放。我认为,如果一个人“忘记”处理这个类,那么除了在内存中留下以前的散列值的安全问题之外,就不会有任何泄漏或问题。如果你认为MD5散列在某些应用程序中不安全,我建议你也使用另一种散列算法。一个很好的选择是SHA家族,比如Sha256。它们也可以在.NET中使用。打得好。我记得读MD5几年前就被证明是脆弱的。Geeze,Wikipedia的这篇文章:“2006年3月18日,Klima发布了一种算法[10],可以在一台笔记本电脑上用他称之为隧道的方法在一分钟内找到碰撞。”
byte[] hashCode;

using(var hasher = new MD5CryptoServiceProvider())
{
    hashCode = hasher.ComputeHash(data);
}