除了性能和安全考虑之外,假设一个具有完美雪崩效应的散列函数,我应该使用它来校验数据块:CRC32 还是截断为 N 字节的散列?即哪个将有更小的概率错过错误?具体来说:
- CRC32 与 4 字节哈希
- CRC32 与 8 字节哈希
- CRC64 与 8 字节哈希
数据块将通过网络传输并重复存储在磁盘上。块的大小可以是 1KB 到 1GB。
据我了解,CRC32 可以以 100% 的可靠性检测多达 32 位翻转,但之后它的可靠性接近1-2^(-32)
并且对于某些模式来说要差得多。完美的 4 字节散列可靠性始终为1-2^(-32)
,所以请看图。
8 字节散列应该具有更好的整体可靠性(2^(-64)
错过错误的机会),那么它应该优于 CRC32 吗?那么CRC64呢?
我想答案取决于此类操作中可能出现的错误类型。我们是否可能会看到稀疏的 1 位翻转或大量块损坏?此外,鉴于大多数存储和网络硬件都实现了某种 CRC,不应该已经处理意外的位翻转吗?