【问题标题】:How to "reduce" a hash?如何“减少”哈希?
【发布时间】:2010-06-13 15:56:05
【问题描述】:

假设我有任何“长”散列,例如 16 字节的 MD5 或 20 字节的 SHA1。 出于GetHashCode() 的目的,我想将此哈希减少到适合 4 个字节。

首先,我非常清楚我会遇到更多的碰撞。在我的情况下这完全没问题,但我仍然希望尽可能少地发生碰撞。

我的问题有几种解决方案:

  • 我可以获取散列的前 4 个字节。
  • 我可以获取散列的最后 4 个字节。
  • 我可以获取 4 个随机字节的哈希值。
  • 我可以生成散列的散列,涉及经典的素数乘法。

还有其他我没有想到的解决方案吗?更重要的是,什么方法会给我最独特的哈希码?我目前认为它们几乎是等价的。

Microsoft 选择程序集的公钥标记是其公钥的 SHA1 哈希的最后 8 个字节,所以我可能会选择这个解决方案,但我想知道原因。

【问题讨论】:

    标签: .net hashcode


    【解决方案1】:

    任何哈希都已经是约简。

    密码散列的设计使得数据的任何部分对散列的任何部分的影响都比其他任何部分大。所以你选择哈希的哪个位并不重要。

    【讨论】:

      【解决方案2】:

      除第三个选项外的任何选项 - 随机选择字节 - 都可以正常工作。如果随机选择字节,相同的输入每次都会产生不同的哈希码,这违背了哈希码的目的。

      【讨论】:

      • 我当然在考虑“硬编码”随机。不过感谢您的反馈。
      【解决方案3】:

      如果你随机取 4 个字节,那么你会遇到两个完全相同的 SHA1 哈希产生不同的 GetHashCode 哈希的情况。

      我只会选择前 4 个字节 - SHA1 的设计是为了让任何字节都不应该像任何其他字节集一样重要。

      【讨论】:

      • 您的意思是“没有字节应该比任何其他集合重要”?
      【解决方案4】:

      如果您有合理数量的哈希,请将它们编入索引(例如存储在数据库中):

      1 - 987baf9gfd79b7979debe90085eadf5
      2 - 9754gccgfd79s7979abbc90085eadf5
      ...
      

      【讨论】:

        【解决方案5】:

        如果您当前的哈希值是一个字符串,只需在该字符串上调用 GetHashCode,它就会返回一个 int,4 个字节。

        有什么用吗?

        【讨论】:

          猜你喜欢
          • 2013-01-10
          • 2012-12-02
          • 1970-01-01
          • 2018-08-05
          • 1970-01-01
          • 2019-03-17
          • 1970-01-01
          • 2016-09-05
          • 1970-01-01
          相关资源
          最近更新 更多