我们使用 diff 来查找两个文件之间的差异。我们使用校验和实用程序来查找哈希并稍后进行比较。在这方面,我有一些问题:
- 我们可以区分任何类型的文件吗?例如,我可以将 MP3 文件与 diff 进行比较吗?我可以找到 MP3 文件的哈希值。但是我可以使用 diff 来检查它们的完整性吗?
- diff 如何处理非文本文件?
- 如何使用 diff 比较两个不同目录中的所有文件?如果某些文件损坏或被篡改,diff 会报告它吗?
- 如何找到整个目录的校验和进行比较?
提前致谢..!
我正在尝试确定是否存在bzip2
用于压缩需要 100% 可重现的文件的任何潜在问题。具体来说:元数据(名称/inode、lastmod 日期等)或其他任何内容是否会导致相同的文件内容在生成的存档上产生不同的校验和.bz2
?
例如,除非使用 gzip,否则默认情况下 gzip 不是确定性-n
的。
到目前为止,我的粗略测试表明,在给定相同的输入数据(无论元数据、平台、文件系统等)的情况下,bzip2 确实确实始终如一地生成相同的文件,但如果有更多的轶事证据,那就太好了。
我不知道在 Unix V5 和 V6 中该sum
命令使用了什么算法。
起初,我认为它是字节模数 2^16 的简单总和。然而,对于重复 320 次的字符串“1111111111\n”,它计算的校验和为28930(使用Julius Schmidt 的 JavaScript 的 PDP-11 模拟器)。而它的简单字节总和要小两个字节:
$ python -c 'print(sum(bytearray(b"1111111111\n"*320)) & 0xFFFF)'
28928
后来,从MacOS 的手册页中,我发现sum
andcksum
命令有很长的不一致历史。然而,即使是 MacOS 上提供的“历史”算法版本也不同意 Unix V5 的校验和。最接近的匹配是 UNIX System V 的默认sum
命令(在 Mac 上调用,如cksum -o 2
),它为此字符串返回相同的校验和,但不同意其他命令:
$ python -c 'print("1111111111\n"*320, end="")' | cksum -o 2
28930 7
更具体地说,cksum -o 2
和 Unix V5sum
对模拟器中的大多数二进制文件(例如,在文件夹中/bin
)产生不同的输出,尽管它们在大多数文本文件上是一致的。
这是模拟器中的真实行为还是错误?如果是正版,是什么算法?
PS这是源代码,如果有人可以阅读1974年的汇编代码。
我曾经crc32
将一些文件与它们的备份进行比较。在 3556 个文件中,有 11 个被报告为“BAD”,如下例所示:
9be46354 ./9836Feeding_the_dog_.mpeg BAD 9be46354 != 9836Feed
但是,这些文件还不错,但由于某种原因crc32
,将它计算的校验和与文件名的一部分进行了比较。
然后我尝试了一个实验:
$ echo 12345 > 9836Feeding_the_dog_.mpeg
$ crc32 9836Feeding_the_dog_.mpeg
261dafe6
所以这次crc32
似乎没有将校验和与文件名进行比较,并且文件不是'BAD'。
这里发生了什么?其他校验和会发生这种情况吗?