对于大小为4096的缓冲区,最快的校验和算法是什么?

时间:2017-07-06 00:00:02

标签: c++ windows hash compare checksum

我正在寻找尽可能快的哈希/校验和算法,同时仍然能够检测到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;
}

1 个答案:

答案 0 :(得分:2)

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

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

但请注意,

  

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

是一款有风险的游戏。 xxHash64的64位输出肯定不足。你肯定会有哈希冲突。我要说你至少需要使用256位哈希才能达到这个目的。它不会100%检测到变化,但会关闭。通常的观点是使用散列大小,其碰撞概率低于系统失败的概率(乘以10 ^ -X,其中X是“小”正数,如5)。