我正在寻找一个哈希函数以在身份生成器内部使用二进制对象。每个对象都应根据其内容获得简短的ID。
先决条件:
32
个字节,以便最大寻址256^32
个对象(但此要求可能会放宽)。考虑到这些要求,我选择了SHA256
哈希,但不幸的是,对于我的目的而言,它不够快。我能够进行基准测试的最快的SHA256
实现是openssl
和boringssl
:在台式机Intel Core I5 6400
上,每个内核可以实现420 MB/s
。其他实现(例如Go中的crypto/rsa
)则更慢。我想用提供与SHA256
相同的碰撞保证,但提供更好的吞吐量(每个内核至少SHA256
)的其他哈希函数替换600 MB/s
。
请分享您对解决此问题的可能选择的看法。
我还要指出,无法进行硬件更新(例如购买带有AVX512
指令集的现代CPU)。重点是找到可以在商用硬件上提供更好性能的哈希函数。
答案 0 :(得分:2)
签出Cityhash和HighwayHash。两者都有256位变体,并且比SHA256快得多。 Cityhash更快,但是它是非加密哈希。 HighwayHash较慢(但仍比SHA256快),并且secure哈希。
所有现代的非加密哈希值都比SHA256 快得多。如果您愿意使用128位哈希,则会有更多options。
请注意,您可能要考虑使用128位哈希,因为它可能足以满足您的目的。例如,如果您有10 10 个不同的对象,则与质量128位哈希发生冲突的可能性小于10 -18 。检出表here。
答案 1 :(得分:0)
最后,对于我的用例,BLAKE2S_256
比SHA256
更好。