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

时间:2018-10-29 08:41:35

标签: hash blob identity sha256

我正在寻找一个哈希函数以在身份生成器内部使用二进制对象。每个对象都应根据其内容获得简短的ID。

先决条件:

  1. 功能应该很快。
  2. 冲突概率必须尽可能低(如果两个内容不同的对象具有相同的ID,则身份系统将被完全破坏)。
  3. ID的最佳长度为32个字节,以便最大寻址256^32个对象(但此要求可能会放宽)。

考虑到这些要求,我选择了SHA256哈希,但不幸的是,对于我的目的而言,它不够快。我能够进行基准测试的最快的SHA256实现是opensslboringssl:在台式机Intel Core I5 6400上,每个内核可以实现420 MB/s。其他实现(例如Go中的crypto/rsa)则更慢。我想用提供与SHA256相同的碰撞保证,但提供更好的吞吐量(每个内核至少SHA256)的其他哈希函数替换600 MB/s

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

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

2 个答案:

答案 0 :(得分:2)

签出CityhashHighwayHash。两者都有256位变体,并且比SHA256快得多。 Cityhash更快,但是它是非加密哈希。 HighwayHash较慢(但仍比SHA256快),并且secure哈希。

所有现代的非加密哈希值都比SHA256 快得多。如果您愿意使用128位哈希,则会有更多options

请注意,您可能要考虑使用128位哈希,因为它可能足以满足您的目的。例如,如果您有10 10 个不同的对象,则与质量128位哈希发生冲突的可能性小于10 -18 。检出表here

答案 1 :(得分:0)

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