为什么 `cksum` 会比 `md5sum` 运行得慢?

Cal*_*ter 3 backup checksum

我一直在为我的虚拟机备份 Windows 安装程序映像,并验证数据是否正确传输,我一直在使用cksum. 出于好奇,我决定比较cksum运行与运行md5sum相同文件所需的时间。多次运行每个操作后的结果(以确保它与 I/O 缓存无关)md5sum始终花费大约一半的时间cksum。我有两个问题...

  1. 为什么会md5sum比 快这么多cksum
  2. 为了找到随机误差的目的,没有任何理由,我应该选择cksummd5sum

我正在运行 Arch Linux。

注意:这不是关于哪个更好的问题。之前已经多次讨论过这一点,我知道md5sum不能用作加密哈希。我特别询问使用md5sum作为查找随机错误的手段。

Ste*_*itt 6

两种哈希算法执行的计算是不同的,因此它们具有不同的性能特征也就不足为奇了。在 Linux 系统上,md5sumcksum通常都是 GNUcoreutils版本。md5sum使用 C 库的 MD5 函数,这些函数经过很好的优化并且一次对块内容进行 32 位操作(参见md5.cmd5-block.c)。cksum使用它自己的 CRC 实现,它一次对内容进行一个字节的操作(请参阅 参考资料cksum.c)。md5sumcksum;相比,这可能是影响速度的一个因素;毫无疑问,其他人。

要确定哪种工具更适合查找随机错误,您需要分析所涉及算法的数学属性。在一个非常基本的层面上,cksum产生一个 32 位的散列,而md5sum产生一个 128 位的散列,因此后者应该更能抵抗意外碰撞(从而更好地检测随机错误,特别是作为翻转位的数量增加)。

我可以看到选择的唯一原因cksummd5sum在于前者是由POSIX指定的,所以任何POSIX系统有它-如果这是一个因素则cksum可能更合适。

(关于您对加密哈希的评论,cksum根本不是加密哈希,所以这个问题没有实际意义。)