我有以下用例:是否有可能复制.NET HashAlgorithm(用于重复增量散列结果)?
- 读取n个从一个文件的字节
- 计算(MD5)散列这些n个字节
- 阅读来自文件
- 计算(MD5)散列接下来的m个字节对于最多n + m个字节的文件
递增散列文件不是问题。
的问题是,我需要共享其开始字节数据的多个哈希值,但我已经叫TransformFinalBlock
后读取第一n
字节,我不能继续使用相同的对象散列Hash
,需要一个新的。
搜索的问题,我看到这两个Python以及OpenSSL有一个选项来复制一个散列对象出于这样的目的:
hash.copy()
返回副本( “克隆”)的哈希对象。这个可用于有效地计算共享公共初始子字符串的字符串的摘要。
EVP_MD_CTX_copy_ex()可以用于复制信息从 到出消化状态。 如果要对大量数据进行散列,这很有用 仅在最后几个字节中有所不同。在调用此函数之前,必须初始化 。
搜索,因为我可以,我无法找到任何withing股票C#HashAlgorithm,让我能够有效Clone()
==复制这样的对象之前调用其TransformFinalBlock
方法 - 事后继续散列其余的数据与克隆。
我发现了一个可以轻松适应克隆(*)的C# reference implementation for MD5,但强烈倾向于使用那里的东西而不是将这样的东西引入代码库。 (*)据我所知,任何散列算法(而不是加密/解密)我一直困扰检查是微不足道的,因为所有的这种算法的状态是一种形式的消化。
所以我在这里丢失了什么,或者标准的C#/ .NET接口实际上没有提供复制散列对象的方法吗?
另一个数据点:
为crypto services微软自己原生API有一个函数CryptDuplicateHash
,其状态的文档,报价:
的CryptDuplicateHash功能,可用于创建分开哈希 两个不同的内容,开始于相同的内容。
自从Windows XP出现以来, : - |
注意wrt。 MD5:用例不是密码敏感的。只是可靠的文件校验和。
它的一个问题不是一成不变的克隆,有些类可能会使用本地资源或调用具有句柄的专用硬件。这些类的类型不会很容易克隆。 – 2014-09-30 14:56:49
@Scott - 谢谢。是的,我想有些班可能会。但是,那些*不*像MD5那样的应该是可以克隆的。所以没办法? – 2014-09-30 15:21:03
看起来好像你想要一个浅拷贝,你将不得不迭代整个事物并自己创建它。 – 2014-09-30 16:21:28