C#中用于计算“动态” md5(如未知长度的流的哈希)的最佳解决方案是什么?具体来说,我想根据通过网络接收的数据来计算哈希。我知道当发送方终止连接时我已经完成了接收数据,所以我事先不知道长度。

[编辑]-现在我正在使用md5,并且在将数据保存并写入磁盘后对其进行第二次传递。我宁愿将它从网络中散发出来。

最佳答案

像其他哈希函数一样,MD5不需要两次通过。

开始:

HashAlgorithm hasher = ..;
hasher.Initialize();

随着每个数据块的到达:
byte[] buffer = ..;
int bytesReceived = ..;
hasher.TransformBlock(buffer, 0, bytesReceived, null, 0);

要完成并检索哈希:
hasher.TransformFinalBlock(new byte[0], 0, 0);
byte[] hash = hasher.Hash;

此模式适用于从HashAlgorithm派生的任何类型,包括MD5CryptoServiceProviderSHA1Managed
HashAlgorithm还定义了一种ComputeHash方法,该方法采用Stream对象。但是,此方法将阻塞线程,直到流被消耗为止。使用TransformBlock方法可以在数据不占用线程的情况下计算出“异步哈希”。

关于c# - 从C#中未知长度的流中计算哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3621283/

10-16 04:45