我正在设计 Content-addressable storage ,所以我正在寻找一个哈希函数来生成对象标识符。每个对象都应该以这种方式根据其内容获得短 ID:object_id = hash(object_content)
.
先决条件:
32
字节以寻址 256^32
最大对象(但此要求可能会放宽)。 考虑到这些要求,我拿起了
SHA256
哈希,但不幸的是它对我的目的还不够快。 SHA256
的最快实现我能够进行基准测试的是openssl
和 boringssl
: 在我的桌面上Intel Core I5 6400
它给出了大约 420 MB/s
每个核心。其他实现(如 Go 中的 crypto/rsa
)甚至更慢。我想替换 SHA256
与提供与 SHA256
相同的冲突保证的其他哈希函数,但提供更好的吞吐量(每个内核至少 600 MB/s
)。请分享您对解决此问题的可能选项的意见。
另外我想指出,硬件更新(比如购买带有
AVX512
指令集的现代 CPU)是不可能的。重点是找到能够在商品硬件上提供更好性能的哈希函数。
最佳答案
查看 Cityhash和 HighwayHash .两者都有 256 位变体,并且比 SHA256 快得多。 Cityhash 更快,但它是非加密哈希。 HighwayHash 较慢(但仍比 SHA256 快),并且 secure哈希。
所有现代非加密哈希都是 很多比 SHA256 更快。如果您愿意使用 128 位散列,您将拥有更多 options .
请注意,您可能需要考虑使用 128 位哈希,因为它可能足以满足您的目的。例如,如果您有 1010 个不同的对象,您与质量 128 位散列发生冲突的概率小于 10-18。查看表格 here .
关于来自对象内容的哈希作为对象 ID : fast alternatives for SHA256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53041646/