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

时间:2014-05-21 12:27:23

标签: c# .net hash sha1

我目前正在实施分块文件上传。理想情况下,我想计算上传文件的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页面,没有任何东西可以用来获取内部状态。

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

那么,有什么方法可以抓住内部状态吗?

1 个答案:

答案 0 :(得分:1)

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

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