来自对象内容的哈希作为对象 ID:SHA256 的快速替代方案
Hash from object's content as object ID: fast alternatives for SHA256
我正在研究 Content-addressable storage 的设计,因此我正在寻找一个哈希函数来生成对象标识符。每个对象都应该根据其内容以这种方式获得短 ID:object_id = hash(object_content)
.
先决条件:
- 散列函数应该很快。
- 碰撞概率必须尽可能低。
- 最佳 ID 长度为
32
字节,以便最多可寻址 256^32
个对象(但此要求可能会放宽)。
考虑到这些要求,我选择了 SHA256
哈希,但不幸的是,它的速度不够快,无法满足我的目的。我能够进行基准测试的 SHA256
最快的实现是 openssl
和 boringssl
:在我的桌面上 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_256
比 SHA256
更好。
我正在研究 Content-addressable storage 的设计,因此我正在寻找一个哈希函数来生成对象标识符。每个对象都应该根据其内容以这种方式获得短 ID:object_id = hash(object_content)
.
先决条件:
- 散列函数应该很快。
- 碰撞概率必须尽可能低。
- 最佳 ID 长度为
32
字节,以便最多可寻址256^32
个对象(但此要求可能会放宽)。
考虑到这些要求,我选择了 SHA256
哈希,但不幸的是,它的速度不够快,无法满足我的目的。我能够进行基准测试的 SHA256
最快的实现是 openssl
和 boringssl
:在我的桌面上 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_256
比 SHA256
更好。