【问题标题】:A PHP hash function with a long output length?输出长度很长的 PHP 哈希函数?
【发布时间】:2010-09-22 16:05:34
【问题描述】:

在我的代码中,我正在生成 URL 的哈希(实际上是无限长度的)。我目前正在使用 sha1(),我知道它发生冲突的可能性很小,但是我有多达 255 个字节来存储哈希,所以我觉得我不妨利用可用空间来降低冲突的可能性进一步。

有没有:

  1. 另一个具有更长或可自定义哈希长度的 PHP 哈希函数?
  2. 一种使用固定长度哈希函数(如 sha1)和可变长度输入来生成更长哈希的方法?

或者,sha1 的 20 字节哈希对任何事情都足够好,我应该停止担心吗?

【问题讨论】:

    标签: php hash


    【解决方案1】:

    好吧,只有当你有一个短哈希键时才有意义。否则存在表中数据溢出的风险。

    【讨论】:

      【解决方案2】:

      由于我不确切知道您要做什么,因此我假设您不想输入两次数据,并且希望能够快速检测碰撞。在这种情况下,我提出了以下伪代码算法:

      found = false
      hv = hash(urlValue)
      if table[hash,url] contains pair (hv,urlValue)
         found = true
      endif
      
      if (not found)
         insert table (hv,urlValue)
      endif
      

      在您的数据库中,在哈希列上创建一个非唯一索引以加快查找速度。这将允许对 (hash,url) 的查询快速进行——在正常情况下,您只查看一行,因为哈希可能是唯一的,但您实际上是根据实际 url 决定接受或拒绝。这将允许您使用更短的散列函数。大概您已经存储了 url 以供以后使用,因此这不会涉及任何额外的存储。

      【讨论】:

        【解决方案3】:

        如果你真的想对它着迷,你可以做的就是组合 URL 不同部分的哈希值。

        假设 URL 有 40 个字符长 - 将其分成 5 部分:获取字符 1-8 的 SHA1,连接到字符 9-16 的 SHA1,连接到 17-24 的 SHA1...等等。理论上然后您将有 2800 种可能性,并且只需要在 2(69*5) = 2345 = 之后开始担心碰撞7.2 * 10103 行。

        但就像我说的,我们正用这样的方法直接进入疯狂的小镇。

        【讨论】:

          【解决方案4】:

          让我们看看...http://www.cryptography.com/cnews/hash.html

          问:找到有多难 SHA-1 中的冲突?
          - 答:报告 攻击需要估计的工作 2^69 的因数(约 590 十亿)哈希计算

          看起来风险很低……^_^

          【讨论】:

            【解决方案5】:

            您总是可以将顺序 ID(十进制或十六进制)添加/附加到现有哈希?

            当然,您不会有固定长度的散列,但您会知道代码是 a) 唯一且 b) 不可猜测的(即使有人注意到顺序部分,他们也不知道您的加盐/散列方式其余代码)。

            当然,如果您不想向任何人隐藏这些哈希值,那么为什么不首先简单地使用顺序 ID?

            【讨论】:

              【解决方案6】:

              如果您真的很担心,请选择 256 位或 512 位哈希(32 或 64 个字符)。

              如果你真的非常偏执,加点盐。

              如果您比这更偏执,请将两个散列连接成一个更长的散列,例如 md5 和 sha-256。

              【讨论】:

              • 听起来这个系统被用来防止输入重复的网址......如果是这样的话,加盐会破坏目的。
              • 确实够了...我认为,如果您真的预计会发生冲突,那么您收集的 URL 太多了 :)
              【解决方案7】:

              或者,sha1 的 20 字节对任何事情都足够好,我应该停止担心吗?

              没错。

              哈希表、分类和生日
              http://www.codinghorror.com/blog/archives/001014.html

              【讨论】:

              • 生日悖论正是我所担心的——我不想进入这样一个阶段:当我有几个 100k 行时,发生碰撞的几率变得不可忽视。鉴于我有足够的字节来存储更长的哈希值,如果可用的话,我不应该使用它吗?
              猜你喜欢
              • 1970-01-01
              • 2015-03-30
              • 2015-08-22
              • 1970-01-01
              • 2017-08-27
              • 1970-01-01
              • 2019-10-30
              • 1970-01-01
              • 2011-04-26
              相关资源
              最近更新 更多