来自对象内容的哈希作为对象 ID : fast alternatives for SHA256

标签 hash blob identity sha256

我正在设计 Content-addressable storage ,所以我正在寻找一个哈希函数来生成对象标识符。每个对象都应该以这种方式根据其内容获得短 ID:object_id = hash(object_content) .

先决条件:

  • 散列函数应该很快。
  • 碰撞概率必须尽可能低。
  • 最佳 ID 长度为 32字节以寻址 256^32最大对象(但此要求可能会放宽)。

  • 考虑到这些要求,我拿起了SHA256哈希,但不幸的是它对我的目的还不够快。 SHA256 的最快实现我能够进行基准测试的是opensslboringssl : 在我的桌面上Intel Core I5 6400它给出了大约 420 MB/s每个核心。其他实现(如 Go 中的 crypto/rsa)甚至更慢。我想替换 SHA256与提供与 SHA256 相同的冲突保证的其他哈希函数,但提供更好的吞吐量(每个内核至少 600 MB/s)。

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

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

    最佳答案

    查看 CityhashHighwayHash .两者都有 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/

    相关文章:

    c++ - 计算 unordered_map 的运行哈希的最佳方法?

    arrays - 如何通过哈希值之一从哈希数组中获取哈希引用?

    c# - 使用 System.IO.FileStream 将字节数组保存为图像时无法看到图像

    sql-server - 违反身份列上的主键错误

    asp.net-mvc - 我应该如何处理 Window Phone/WCF/ASP.NET MVC 应用程序的用户身份?

    c - 大型数组的频繁随机访问

    javascript - 如何使用 Azure Blob 服务将 Blob 上传到 Azure Blob 存储

    node.js - 查看树中是否有与 blob 匹配的文件的最快方法

    asp.net - 向 User 类添加属性违反了 TContext 类型的约束

    php - 大文件的 Opensubtitles 哈希函数失败