将对象内容作为对象 ID 进行哈希处理:SHA256 的快速替代方案

Vit*_*aev 5 hash identity blob 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每个核心。其他实现(如crypto/rsaGo)甚至更慢。我想SHA256用其他散列函数替换,它提供与 相同的碰撞保证SHA256,但提供更好的吞吐量(至少600 MB/s每个内核)。

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

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

gez*_*eza 4

查看CityhashHighwayHash。两者都有 256 位变体,并且比 SHA256 快得多。Cityhash 速度更快,但它是非加密哈希。HighwayHash 速度较慢(但仍比 SHA256 更快),并且是安全哈希。

所有现代非加密哈希都比 SHA256快得多。如果您愿意使用 128 位哈希,您将有更多选择

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