首页 文章

c#计算哈希值 - 多个流之间的持久状态

提问于
浏览
2

我目前正在实现分块文件上传 . 理想情况下,我想计算上传文件的SHA1哈希值 . 但是,我将文件直接传输到位于远程位置的数据库,因此每次访问时都会遇到性能损失 .

我使用以下代码计算我们的离线应用程序中使用的单个批量上传的哈希值:

...
...
using (var uploadStream = SqlDataUploadStream.Create(initial, subsequent))
using (var sha1Hasher = System.Security.Cryptography.SHA1.Create())
using (var hashStream = new CryptoStream(uploadStream, sha1Hasher, CryptoStreamMode.Write))
{
    ...
    Copy to hashStream here...
    ...
}

当然,由于通过HTTP进行的上传被分块,因此没有一个连续的流可以计算哈希值 .

但是,如果我可以以某种方式获取并设置哈希类本身的内部状态,我可以在块帖之间保持状态并像这样计算哈希,而不必返回到最后的数据库再次读取整个事物 . 不幸的是,快速浏览一下SHA1类的MSDN页面,没有任何东西跳出来,我可以用来获取内部状态 .

我可以在会话中持久化整个哈希类,但是因为它想要处理我有点厌倦这样做以防万一出错并且我没有机会手动处理它 .

那么,有什么办法可以 grab 内部状态吗?

1 回答

  • 1

    如果要保持哈希状态,请使用 SHA1Managed (无需处置)或仅使用其他库 . 虽然 SHA1Managed 在其实现中没有任何内容可以利用这一事实 .

    你提到过将它放入会话中 . 这是一个肮脏的事情,因为现在用户只能有一个并发上传 . 我会说,会话滥用的典型案例 . 我宁愿将散列状态存储在您正在创建的blob旁边的数据库中 .

相关问题