Hash 校验和:CRC还是哈希?

Hash 校验和:CRC还是哈希?,hash,checksum,crc32,error-detection,Hash,Checksum,Crc32,Error Detection,撇开性能和安全考虑不谈,假设一个具有完美雪崩效应的散列函数,我应该使用哪一个来对数据块进行校验和:CRC32还是被截断为N字节的散列?也就是说,哪一个遗漏错误的概率更小?具体而言: CRC32与4字节哈希 CRC32与8字节哈希 CRC64与8字节散列 数据块将通过网络传输并反复存储在磁盘上。块的大小可以是1KB到1GB 据我所知,CRC32可以100%可靠地检测多达32位的翻转,但在这之后,其可靠性接近1-2^(-32),而对于某些模式,可靠性要差得多。一个完美的4字节哈希可靠性总是1-2^(

撇开性能和安全考虑不谈,假设一个具有完美雪崩效应的散列函数,我应该使用哪一个来对数据块进行校验和: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,是否应该已经考虑到意外的位翻转?

    只有您可以说1-2-32是否适合您的应用程序。CRC-n和良好散列函数的n位之间的错误检测性能将非常接近,因此选择哪个更快。这很可能是CRC-n

    更新:

    上述“很可能是CRC-n”仅在某种程度上是可能的。如果使用非常高性能的散列函数,则可能性不大。特别是,它的速度似乎与使用英特尔
    crc32
    硬件指令计算的CRC-32的速度非常接近!我在434 MB的文件上测试了三个CityHash例程和英特尔
    crc32
    指令。
    crc32
    指令版本(计算CRC-32C)占用了24毫秒的CPU时间。CityHash64需要55毫秒,CityHash128需要60毫秒,CityHashCrc128需要50毫秒。CityHashCrc128使用相同的硬件指令,尽管它不计算CRC

    为了快速完成CRC-32C计算,我不得不在三个独立的缓冲区上使用三条crc32指令,以便在一个内核中并行使用三个算术逻辑单元,然后在汇编程序中编写内部循环。CityHash真是太快了。如果您没有
    crc32
    指令,那么您将很难计算出与CityHash64或CityHash128一样快的32位CRC

    但是,请注意,出于此目的,需要修改CityHash函数,或者需要进行任意选择,以便为大数据流上的CityHash值定义一致的含义。原因是这些函数未设置为接受缓冲数据,即一次向函数提供一个块,并期望得到与同时向函数提供整个数据集相同的结果。CityHash函数需要修改以更新中间状态

    另一种选择,以及我为快速而肮脏的测试所做的,是使用函数的种子版本,其中我将使用来自前一个缓冲区的CityHash作为下一个缓冲区的种子。问题是结果取决于缓冲区大小。如果使用这种方法为CityHash提供不同大小的缓冲区,则会得到不同的哈希值

    四年后的另一次更新:


    速度更快的是。我现在建议,对于非加密散列,使用CRC进行加密。

    将“性能”问题放在一边;你可能想考虑使用一个ShA-2函数(例如Sha256)。

    我想我弄不清楚“一般哈希”是什么意思。好,去掉“一般”,我的坏。嗯,有一些哈希函数,比如Cyyhash或MhMhhash,它可以在1K消息上每时钟周期做几个字节,所以它们有可能击败不加速的CRC32计算。它们产生128位输出以引导。所以我想知道CRC是否有什么概念性的东西使它成为比好的散列更好的校验和。但我想你是对的,这都是关于位数的,所以我想我会选择哈希。不,CRC并不能使它成为更好的校验和,除非你的噪声源是少量的位翻转。我不知道是否有任何哈希函数可以像CRC-n一样保证检测到所有可能的1到n位翻转。关于CityHash,你是对的。我很惊讶看到它有多快。哇。这实际上是把性能问题放在一边。SHA-256所需时间是CRC-32的100倍,或是CityHash的50倍。毫无理由,因为这不是一个需要加密散列的应用程序。事实上,我可能会。可能不完全是SHA-256,因为我不需要加密强度,但是,鉴于校验和中的位数在这里是最重要的,研究256位哈希可能是有意义的。我只是不确定除了SHA-256还有什么,它们是否好。此外,这不是对哈希表的短字符串进行哈希,而是对通常应超过1KB的校验和消息进行哈希。我想这是一个基准测试的问题,看看它会带来多少开销。我一定会保留它作为一个选项。只是做了一个快速搜索,你就是:CityHash 256位版本!必须比SHA快一个数量级。