Hash 来自对象的散列';s内容作为对象ID:SHA256的快速替代方案

Hash 来自对象的散列';s内容作为对象ID:SHA256的快速替代方案,hash,blob,identity,sha256,Hash,Blob,Identity,Sha256,我正在设计,所以我正在寻找一个哈希函数来生成对象标识符。每个对象都应该根据其内容以这种方式获取短ID:object\u ID=hash(object\u content) 先决条件: 散列函数应该很快 碰撞概率必须尽可能低 最佳ID长度为32字节,以便最大寻址256^32对象(但此要求可能会放宽) 考虑到这些要求,我选择了SHA256hash,但不幸的是,它的速度不够快。我能够基准测试的SHA256的最快实现是openssl和boringssl:在我的桌面Intel Core I5 6400上,

我正在设计,所以我正在寻找一个哈希函数来生成对象标识符。每个对象都应该根据其内容以这种方式获取短ID:
object\u ID=hash(object\u content)

先决条件:

  • 散列函数应该很快
  • 碰撞概率必须尽可能低
  • 最佳ID长度为
    32
    字节,以便最大寻址
    256^32
    对象(但此要求可能会放宽)
  • 考虑到这些要求,我选择了
    SHA256
    hash,但不幸的是,它的速度不够快。我能够基准测试的
    SHA256
    的最快实现是
    openssl
    boringssl
    :在我的桌面
    Intel Core I5 6400
    上,它给出了每个内核大约
    420 MB/s
    。其他实现(如Go中的
    crypto/rsa
    )甚至更慢。我想用其他哈希函数替换
    SHA256
    ,它提供与
    SHA256
    相同的冲突保证,但提供更好的吞吐量(每个核心至少
    600 MB/s

    请分享您对解决此问题的可能方案的看法

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

    请签出并重试。两者都有256位变体,比SHA256快得多。Cityhash速度更快,但它是一种非加密哈希。HighwayHash速度较慢(但仍比SHA256快),并且是一个哈希

    所有现代非加密散列都比SHA256快得多。如果你愿意使用128位的散列,你会得到更多


    注意,您可能需要考虑使用128位散列,因为它可能适合您的目的。例如,如果有1010个不同的对象,则与高质量128位哈希冲突的概率小于10-18。查看表格。

    最后,对于我的用例,
    BLAKE2S_256
    证明是一个比
    SHA256
    更好的选项,请在此处查看哈希:。顺便说一句,我真的不知道你说的“地址”是什么意思,但是一个32字节的ID可以有256^32个不同的值(不是8^32)。@geza,谢谢,那是个错误。我所说的“地址”是指系统中可能存在的对象总数的上限。一个系统中可能存在的对象总数的上限是256^32,这个上限非常大,大约是10^76!考虑到在已知的、可观测的宇宙中只有大约10 ^ 78到10 ^ 82个原子,我想知道你们将如何存储这些物体。2.SHA256不是无冲突的。当对索引进行散列时,通常使用快速散列并期望冲突,通过使用列表或重新散列可以感觉到冲突。4.如果“如果两个具有不同内容的对象具有相同的ID,则标识系统将被完全破坏”,则仅使用散列时,系统被设计破坏。@zaph 1。我同意这个数量的钥匙太多了,不太可能拿到。但由于某些原因,成熟的键值存储往往使用长键。例如,使用SHA512作为内部存储密钥;2.是的,SHA256不是无碰撞的,但发生碰撞的概率接近于零。SHA256是ZFS内置重复数据消除系统的默认哈希,据我所知,在启用SHA256时,没有任何冲突检查技术(它们仅在使用Fletcher4等弱哈希时检查冲突)。谢谢,让我确保我正确理解了它。。。是否可以通过碰撞概率来比较哈希函数?如果是这样的话,您的意思是有非加密哈希(您在上面提到过)提供与SHA256相同的抗冲突性吗?@Vitalyisev:好的非加密哈希应该具有与加密哈希相同的抗冲突性。当然,这不能保证。这就是为什么存在SMHasher测试,以检查哈希的行为。如果一个散列通过它,它应该不是一个坏的散列,它没有一个主要的缺陷。但是,如果您想绝对确保获得尽可能好的散列,请使用众所周知的加密散列。SMHasher中的一些哈希是由google设计的,google积极使用它们。所以我认为这些散列一定很好。好吧,我要试试HighwayHash。再次感谢:)@VitalyIsaev:如果您想减少冲突的可能性,请使用两个或更多哈希:)这仍然比SHA256快得多,并且冲突概率要低得多(如果连接的位长度大于256)。@VitalyIsaev:btw,SHA256在当前x86 CPU上有支持,如果可能,您可能希望使用它。这样,SHA256变得更快。