来自对象内容的哈希作为对象 ID:SHA256 的快速替代方案

Hash from object's content as object ID: fast alternatives for SHA256

我正在研究 Content-addressable storage 的设计,因此我正在寻找一个哈希函数来生成对象标识符。每个对象都应该根据其内容以这种方式获得短 ID:object_id = hash(object_content).

先决条件:

  1. 散列函数应该很快。
  2. 碰撞概率必须尽可能低。
  3. 最佳 ID 长度为 32 字节,以便最多可寻址 256^32 个对象(但此要求可能会放宽)。

考虑到这些要求,我选择了 SHA256 哈希,但不幸的是,它的速度不够快,无法满足我的目的。我能够进行基准测试的 SHA256 最快的实现是 opensslboringssl:在我的桌面上 Intel Core I5 6400 每个核心大约 420 MB/s。其他实现(比如 Go 中的 crypto/rsa)甚至更慢。我想用其他提供与 SHA256 相同的碰撞保证但提供更好的吞吐量(每个核心至少 600 MB/s)的哈希函数替换 SHA256

请分享您对解决此问题的可能选项的看法。

我还想指出,硬件更新(例如购买带有 AVX512 指令集的现代 CPU)是不可能的。重点是找到能够在商用硬件上提供更好性能的哈希函数。

查看 Cityhash and HighwayHash. Both have 256-bit variants, and much faster than SHA256. Cityhash is faster, but it is a non-cryptographic hash. HighwayHash is slower (but still faster than SHA256), and a secure 哈希。

所有现代非加密散列都比 SHA256 快很多。如果您愿意使用 128 位哈希,您将拥有更多 options.

请注意,您可能需要考虑使用 128 位哈希,因为它可能足以满足您的目的。例如,如果您有 1010 个不同的对象,则与质量 128 位哈希发生碰撞的概率小于 10-18.查看 table here.

最后,对于我的用例,BLAKE2S_256SHA256 更好。