在我目前正在做的一个C#项目中,我们试图计算网络上大量文件的MD5(当前pot是270万,客户端pot可能超过1000万)。随着我们处理的文件数量的增加,速度成为问题。
我们这样做的原因是为了验证文件是否未经修改复制到不同的位置。
我们目前使用如下代码来计算一个文件的MD5
MD5 md5 = new MD5CryptoServiceProvider();
StringBuilder sb = new StringBuilder();
byte[] hashMD5 = null;
try
{
// Open stream to file to get MD5 hash for, create hash
using (FileStream fsMD5 = new FileStream(sFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
hashMD5 = md5.ComputeHash(fsMD5);
}
catch (Exception ex)
{
clsLogging.logError(clsLogging.ErrorLevel.ERROR, ex);
}
string md5sum = "";
if (hashMD5 != null)
{
// Change hash into readable text
foreach (byte hex in hashMD5)
sb.Append(hex.ToString("x2"));
md5sum = sb.ToString();
}
但是,这种速度并不是我的经理一直希望的。我们已经对我们计算 MD5 的文件的方式和数量进行了一些更改(即我们不对我们不复制的文件进行计算......直到今天我的经理改变了主意,所以所有 文件都必须为它们计算 MD5,以防将来客户希望窃听我们的程序,所以我猜所有文件都被复制了)
我意识到网络速度可能是一个主要影响因素 (100Mbit/s)。有没有一种有效的方法来计算网络上文件内容的 MD5?
提前致谢。特雷弗·沃森
编辑:将所有代码放在 block 中,而不只是其中的一部分。
瓶颈是整个文件必须通过网络流式传输/复制,而且你的看起来不错......不同的哈希函数(md5/sha256/sha512)的计算时间几乎相同
这个问题的两种可能的解决方案:
1) 在远程系统上运行一个散列器并将散列存储到单独的文件中 - 如果这在您的环境中是可能的。
2) 创建文件的部分散列,以便您只复制文件的一部分。我的意思是这样的:
part1Hash = md5(file.getXXXBytesFromFileAtPosition1)
part2Hash = md5(file.getXXXBytesFromFileAtPosition2)
part3Hash = md5(file.getXXXBytesFromFileAtPosition3)
finalHash = part1Hash ^ part2Hash ^ part3Hash;
您必须测试文件的哪一部分最适合读取,以便哈希值保持唯一。
希望对你有帮助...
编辑:改为按位异或
我是一名优秀的程序员,十分优秀!