【发布时间】:2016-11-23 06:47:34
【问题描述】:
之前我向question 询问了有关组合 SHA1+MD5 的问题,但在那之后我了解到计算 SHA1 然后 MD5 的 lagrge 文件并不比 SHA256 快。 在我的例子中,一个 4.6 GB 的文件大约需要 10 分钟,在 Linux 系统中使用默认实现 SHA256 和 (C# MONO)。
public static string GetChecksum(string file)
{
using (FileStream stream = File.OpenRead(file))
{
var sha = new SHA256Managed();
byte[] checksum = sha.ComputeHash(stream);
return BitConverter.ToString(checksum).Replace("-", String.Empty);
}
}
然后我阅读了this topic,并根据他们所说的以某种方式更改了我的代码:
public static string GetChecksumBuffered(Stream stream)
{
using (var bufferedStream = new BufferedStream(stream, 1024 * 32))
{
var sha = new SHA256Managed();
byte[] checksum = sha.ComputeHash(bufferedStream);
return BitConverter.ToString(checksum).Replace("-", String.Empty);
}
}
但它没有这样的感情,大约需要9分钟。
然后我尝试在 Linux 中通过sha256sum 命令测试我的文件以获得相同的文件,大约需要 28 秒,上面的代码和 Linux 命令都给出相同的结果!
有人建议我阅读哈希码和校验和之间的差异,我联系了 this topic 来解释差异。
我的问题是:
-
是什么原因导致上述代码与 Linux
sha256sum在时间上如此不同? -
上面的代码是做什么的? (我的意思是哈希码计算还是校验和计算?因为如果你在C#中搜索给出文件的哈希码和文件的校验和,它们都会到达上面的代码。)
-
即使 SHA256 是抗碰撞的,是否有任何针对
sha256sum的动机攻击? -
如何使我的实现与 C# 中的
sha256sum一样快?
【问题讨论】:
-
您是否有理由无法使用
Process从代码中调用sha256sum? -
@NateDiamond 是的!首先,该程序必须在 Windows 和 linux 上运行。其次,正如我在问题中提到的,我不知道校验和是否足够安全。(或哈希码)
-
这应该完全被从磁盘读取文件的成本所限制。 9 分钟并非不可想象,但您需要一台廉价的笔记本电脑,配备糟糕的主轴驱动器且内存不足。记录您使用的内容。
-
@HansPassant 其实我现在想知道文件的哈希码和文件的校验和有什么不同吗?
标签: c# mono hashcode checksum sha256