除了性能和安全方面的考虑,假设哈希函数具有完美的雪崩效应,对于数据块的校验和,我应该使用CRC32还是截断为N字节的哈希?也就是说,哪一个会更有可能错过错误?具体如下:
据我所知,CRC32可以以100%的可靠性检测出高达32位翻转,但在此之后,它的可靠性接近
8字节哈希的整体可靠性应该要比CRC32好得多(
我想答案取决于此操作可能出现的错误类型。我们是否可能看到稀疏的1位翻转或大规模块损坏?此外,考虑到大多数存储和网络硬件实现了某种形式的CRC,应该已经处理了意外位翻转吧?
- CRC32与4字节哈希
- CRC32与8字节哈希
- CRC64与8字节哈希
据我所知,CRC32可以以100%的可靠性检测出高达32位翻转,但在此之后,它的可靠性接近
1-2^(-32)
,对于某些模式而言更糟糕。一个完美的4字节哈希的可靠性始终是1-2^(-32)
,因此可以自己理解一下。8字节哈希的整体可靠性应该要比CRC32好得多(
2^(-64)
的错过错误机会),因此应该优先选用8字节哈希。那么CRC64呢?我想答案取决于此操作可能出现的错误类型。我们是否可能看到稀疏的1位翻转或大规模块损坏?此外,考虑到大多数存储和网络硬件实现了某种形式的CRC,应该已经处理了意外位翻转吧?