我一直在备份虚拟机的 Windows 安装程序映像,为了验证数据是否正确传输,我一直在使用cksum
.出于好奇,我决定比较相同文件的cksum
运行时间和运行时间。md5sum
运行每个操作几次后的结果(以确保它与 I/O 缓存无关)始终md5sum
花费大约一半的时间cksum
。我有两个问题...
- 为什么会
md5sum
比 快这么多cksum
? - 为了发现随机错误,我有什么理由应该
cksum
选择md5sum
.
我正在运行 Arch Linux。
笔记:这不是哪个更好的问题。这之前已经讨论过很多次了,我知道md5sum
这不应该被用作密码学的哈希。我具体询问如何使用md5sum
作为查找手段随机误差。
答案1
两种哈希算法执行的计算不同,因此它们具有不同的性能特征也就不足为奇了。在 Linux 系统上,md5sum
和cksum
通常都是 GNUcoreutils
版本。md5sum
使用 C 库的 MD5 函数,该函数经过了很好的优化,并且一次对块内容 32 位进行操作(请参阅md5.c
和md5-block.c
)。cksum
使用自己的 CRC 实现,一次对一个字节的内容进行操作(请参阅cksum.c
)。md5sum
与 相比,这可能是速度的一个影响因素cksum
;毫无疑问还有其他人。
要确定哪种工具更适合查找随机错误,您需要分析所涉及算法的数学属性。在非常基本的层面上,cksum
生成 32 位哈希值,而md5sum
生成 128 位哈希值,因此后者应该更能抵抗意外冲突(因此能够更好地检测随机错误,特别是当翻转位的数量较多时)增加)。
我认为选择的唯一原因cksum
是md5sum
前者是由 POSIX 指定的,因此任何 POSIX 系统都会有它——如果这是一个因素,那么cksum
会更合适。
(关于您对加密哈希的评论,cksum
根本不是加密哈希,所以这个问题没有实际意义。)