在 Ubuntu 24.04 中,
sha256sum
对于同一文件多次给出了不同的结果。以下是我的 shell 日志的摘录。
$ for i in *.7z; do sha256sum $i; done
...
a5a887bd0c9e9ed03a1a7851c2b6216ce77284c5d8fd326c008426475d39c3b8 somefile=.7z
...
$ pv somefile=.7z | sha256sum
...
f62423e10e3a629fe07a5d4d3212942af55541cc1d7b4498a1ca2d97aafdb9c3 -
$ sha256sum somefile=.7z
f62423e10e3a629fe07a5d4d3212942af55541cc1d7b4498a1ca2d97aafdb9c3 somefile=.7z
$ for i in *.7z; do sha256sum $i; done
...
f62423e10e3a629fe07a5d4d3212942af55541cc1d7b4498a1ca2d97aafdb9c3 somefile=.7z
...
somefile=.7z
在第一个循环中获得了一个哈希值,但随后又获得了另一个哈希值。该文件自很久以前创建以来从未被修改过。上面的 shell 日志是在几分钟内获取的。文件大小约10G。
我无法再重现该问题,因为哈希似乎已经稳定了。但在摘录上面的日志之前,
sha256sum
给了我另外两个不同的哈希值,总共四个,这让我很难再相信sha256sum
的结果了。
所以,我的问题是,在我可能忘记提及的任何情况下,如何会出现这种差异?
一些可能重要的因素:
sha256sum
的第一次调用处于循环状态
=
https://en.wikipedia.org/wiki/Data_degradation)。
单个翻转位可能会导致这种情况,如果您使用的存储介质有一个坏点,那么您在那里写入的任何内容都会被损坏,直到该点达到其熵平衡状态。某些文件系统(如 ZFS 或 BtrFS)可以检测到这一点,其他文件系统甚至不添加奇偶校验。我有一个特别坏的 HDD,它的位旋转速度非常快,以至于当我循环读取相同的 4k 块(任何块)并在屏幕上显示黑白位图时,我几乎可以看到位每分钟翻转。