HashAlgorithm.ComputeHash()有状态吗?
我需要独立计算多个数据块的哈希值。 像这样的东西:
using( HashAlgorithm hasher = new ActualHashAlgorithm() ) { for( int i = 0; i = numberOfBlocks; i++ ) { byte[] block = getBlock( i ); byte[] hash = hasher.ComputeHash( block ); // use hash } }
我可以在块之间重用相同的HashAlgorithm
对象吗? HashAlgorithm
会在调用ComputeHash()
HashAlgorithm
重置状态,还是需要处理HashAlgorithm
对象并为每个新数据块创建一个新对象?
使用ComputeHash
通常是无状态的,尽管它取决于实际的实现……你可以在调用ComputeHash
之后通过访问State
来检查它…
看到
- http://msdn.microsoft.com/en-us/library/s02tk69a.aspx
- http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.transformblock.aspx
- http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.transformfinalblock.aspx
- http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.state.aspx
实际上,当你需要在.NET框架下使用哈希时,我强烈建议手动编写这个函数但不要使用.NET框架。
几个月后,我将32位.NET程序移植到64位窗口。 该程序崩溃了。 至少我发现在不同的32 / 64bit系统下哈希值是不同的,尽管相同的.NET程序。 我使用Djb算法代替.NET哈希算法,程序运行正常。
本文档是关于Djb哈希算法的,可以通过C#重写。 这不是一项艰苦的工作。
- DJB Hashfunction