【问题标题】:What is the fastest checksumming algorithm for a buffer of size 4096?对于大小为 4096 的缓冲区,最快的校验和算法是什么?
【发布时间】:2017-07-06 00:00:02
【问题描述】:

我正在寻找一种尽可能快的哈希/校验和算法,同时仍然能够检测到对 4096 字节内存页面的更改。因为大小是固定的,所以我希望有可能为此目的获得优化的算法,因为保证大小不会改变。

我正在做的是对一些内存页面进行校验和,进行操作,然后再次对页面进行校验和以查看它们是否已更改。由于空间原因,简单地按字节与旧字节的副本进行比较是不可行的。我不需要知道更改发生在页面的哪个位置,只要发生更改,比较校验和就足够了。

我在硬件和 xxHash 中尝试过 CRC32,都取得了不错的效果。不过,据我所知,它们并不是为固定大小的缓冲区量身定制的。

编辑:这是我在硬件中用于 CRC32 的代码。由于某种原因,它比 xxHash 慢。

// Warning! Not padding, so don't use if length isn't dividable by sizeof(uint32_t).
uint32_t sse42_crc32_32bit(const uint32_t* buffer, const uint32_t length)
{
    uint32_t crc = 0;
    const uint32_t numRounds = length / sizeof(uint32_t);

    for (uint32_t i = 0; i < numRounds; ++i)
    {
        crc = _mm_crc32_u32(crc, buffer[i]);
    }

    return crc;
}

【问题讨论】:

  • 您预计大部分是命中还是大部分未命中?如果您预计缓冲区会发生很大变化,那么您可以使用非常快的方法(如直接求和),然后使用更慢且更可靠的方法来清除误报?
  • 您是否必须跟踪每一次更改,或者您可以承受错过一些?
  • 值得一试,fork 考虑到所有因素都相当便宜,但您的 CRC 想法也可能是可行的。调试器可以做一些非常疯狂的事情,因为这种功能有操作系统挂钩,所以我敢打赌,你可以在纯用户模式代码中走得很远。
  • CRC32c 将检测到all changes with Hamming distance 4 or less up to roughly 2³¹ bits。大多数典型的散列函数(如 xxHash)没有——也不能,在设计上——给你这个保证。
  • 您正在以缓慢的方式使用 _mm_crc32_u32,纯粹是串行的。有关预期用途,请参见例如this。 E:在您的情况下,您不妨计算单独的 CRC 并将它们全部进行比较,这比合并它们更容易,并且实际上漏报更少。

标签: c++ windows hash compare checksum


【解决方案1】:

farmHash128,比xxHash64快。不过,我不确定它的质量。

如果你使用xxHash64,我认为你可以将它展开一点(例如,8次),它会快一点。如果页面不在缓存中,预取可能会有所帮助。

但是请注意,这个

“如果我错过了一点改变,那就结束了。”

是一个冒险的游戏。 xxHash64 的 64 位输出肯定不够。你肯定会有哈希冲突。我会说您至少需要为此目的使用 256 位哈希。它不会 100% 检测到更改,但会关闭。通常的做法是使用碰撞概率低于系统故障概率的哈希大小(乘以 10^-X,其中 X 是“较小”的正数,如 5)。

【讨论】:

  • 我明白你的意思,但我只是假设人们使用 CRC32 是因为它是可靠的,但我得到的是本质上存在风险。在那种情况下,如何信任数据?
  • @Mikubyte 请记住,CRC32 旨在检测诸如位翻转错误之类的微小事物,而不是大量重写。对于更耐碰撞的东西,你需要使用像 SHA512 这样的重量级产品。
  • @Mikubyte 除非您保留所有字节,否则您不能 100% 保证您不会错过任何更改。所以你有两个选择:1)保留/比较所有字节。 2) 确定小于 0% 的可接受的未命中概率并告诉我们该概率是多少。例如,如果您不能容忍 2^128 中 1 的概率丢失更改,那么您需要使用超过 128 位。
  • @Mikubyte 而且,顺便说一句,如果你真的是说“如果我错过了一点改变,游戏就结束了”,那么你就不能使用计算机,因为它们的概率不为零由于功率波动、宇宙射线或核衰变引起的误差。您必须 决定您可以容忍的错误概率,以决定您使用的设备和算法是否合适。与您的硬件可靠性相当的丢失更改概率的算法必须合适,否则您的硬件不合适。
  • 我们信任安全模型适合我们的威胁模型的协议。我们不知道您的威胁模型是什么。鉴于现代计算机可能因功率波动、宇宙射线、放射性衰变、制造缺陷等原因而出错,您为什么认为现代计算机适合您的应用?您的应用程序可以容忍多大的错误概率?这就是我们需要知道的。
猜你喜欢
  • 2011-05-11
  • 2010-11-13
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2014-04-11
  • 2013-08-08
  • 1970-01-01
相关资源
最近更新 更多