Checksumming

在磁盘中的文件可能会因为一些软件上的 Bug 跟硬件失效等问题受到破坏。为了快速定位有问题的文件,避免他们影响到其他的子系统或其他的节点,我们可以使用 checksums 校验和跟 cyclic redundancy checks (CRC)

有些文献不对加密跟非加密的哈希函数、CRC 以及校验和做出区分,因为他们共同处都是将庞大的数据块转换为一个很小的数字,但他们的使用场景、目标跟保证其实都是不一样的。

校验和提供了最弱的保证,他无法检测出多个位的损坏问题。一般情况下他通过用 XOR 亦或操作跟奇偶校验或者求和计算出来。

CRC 可以检查突发的问题 (比如多个连续的位损坏),他一般是使用查询表跟多项式除法来实现。多个位的错误对于检测来说至关重要,因为大部分的网络通信错误跟存储硬件错误都是以这种方式出现的。

非加密的哈希函数跟 CRC 不应该用来验证数据是否被篡改,因此你应该始终使用加密的哈希函数来保证安全性。CRC 的主要目的是确保数据没有发生意料之外的变化。这些算法并不是被设计用来防御攻击跟防止数据篡改的。

在将数据写入磁盘之前,我们计算他的校验和然后跟数据一起写入磁盘。当我们将它再次读取回来时,我们会再次对数据计算校验和,并将其与写入磁盘的校验和进行比较。如果两个校验和不匹配,我们就知道发生错误了,因此不应该再使用这份数据了。

对整个文件计算校验和是不大现实的,因为我们并不是每次访问都需要读取整个文件。所以通常会使用页级别的校验和,并将校验和保存在页的头部信息中。使用这个方式的校验和能带来更强的健壮性 (因为我们为各个数据的子集都做了校验),因此也不会因为单个页发生错误而导致需要丢弃整个文件了。