【问题标题】:hashing function guaranteed to be unique?散列函数保证是唯一的?
【发布时间】:2012-05-29 11:48:45
【问题描述】:

在我们的应用程序中,我们将收到 png 图像以及大约 200 个字符字节的数组。我想用与该字节数组对应的文件名保存图像,但不是字节数组本身,因为我不想要 200 个字符的文件名。所以,我想我会将字节数组保存到数据库中,然后 MD5 得到一个短文件名。当需要显示特定图像时,我查找它的字节数组,MD5,然后查找该文件。

到目前为止一切顺利。问题是两个不同的字节数组可能会散列到相同的 MD5。然后,一个文件将有效地覆盖另一个文件。或者他们可以吗?我想我的问题是

  • 能否将两个约 200 个字符的字节数组 MD5 散列到同一个字符串?
  • 如果可以的话,这是每 10 个宇宙时代一次的交易还是可以想象在我的应用中发生的事情?
  • 是否有一种哈希算法可以生成一个(比如说)32 个字符的字符串,并且保证是唯一的?

【问题讨论】:

  • 我不明白需要通过一些任意计算来自动确定文件名。只需创建一些密钥...文件名或其他任何内容,并将其存储在 200 字符字节数组旁边,并将其用作您的文件名。将计算从混合中剔除,并使底层代码更简单......
  • 请按常规大写。
  • jsobo - 我想使用散列(或类似)函数的原因是,在很多情况下,源字节数组(和 png)对于不同的用户来说是相同的,所以我可以避免保存在该实例中相同 png 的多个版本。即,如果 100 个人都有相同的字节数组(由于相同的选项集),那么他们都共享相同的 png 文件。

标签: md5 hash


【解决方案1】:

从一个 200 字节的源中获取一个 32 字节的代码在逻辑上是不可能的,这在所有可能的 200 字节源中是唯一的,因为您可以在 200 字节中存储比在 32 字节中更多的信息。

他们唯一的例外是存储在这 200 个字节中的信息也适合 32 个字节,在这种情况下,您的源日期格式将非常低效且浪费空间。

【讨论】:

    【解决方案2】:

    两个散列可能发生冲突的概率取决于散列大小。 MD5 产生 128 位散列。因此,对于 2128+1 个哈希值,将有 至少一个 冲突。

    对于 SHA12512+1,这个数字是 2160+1 strong> 用于 SHA512

    这里适用此规则。输出位越多,唯一性和计算量就越大。所以有一个权衡。你要做的就是选择一个最佳的。

    【讨论】:

    • 在从上述数字得出任何结论之前,您应该阅读有关生日攻击的信息。 en.wikipedia.org/wiki/Birthday_attack
    • 不过,结论是正确的。对于 2^128+1 个输入,将会发生冲突(至少一个)。生日悖论说你可能会更早得到一个。
    【解决方案3】:

    当散列(而不是加密)时,您正在减少被散列的数据的信息空间,因此总是有机会发生冲突。

    在散列函数中你可以期望的最好的结果是所有散列均匀分布在散列空间中,并且你的散列输出足够大,可以提供你的“每 10 个宇宙年龄一次”交易”如你所说!

    因此,哈希对您来说是否“足够好”取决于碰撞的后果。您总是可以在校验和/哈希中添加一个唯一的 ID,以获得两全其美的效果。

    【讨论】:

    • 好吧,如果您希望能够仅从数据源计算代码,则不能。如果可以使用唯一 ID,则可能不需要哈希。
    【解决方案4】:

    为什么不使用数据库中的unique ID

    【讨论】:

    • Uniqe id 并不总是整数。一些 RDMS 具有 uuid 功能。
    【解决方案5】:

    两个~200 char bytearrays MD5-hash 可以归结为同一个字符串吗?

    考虑到 200 字节的字符串多于 32 字节的字符串(MD5 摘要),这是肯定的。

    所有哈希函数都有这个问题,但有些比 MD5 更健壮。试试 SHA-1。 git 将它用于相同的目的。

    【讨论】:

      【解决方案6】:

      可能会发生两个 MD5 哈希冲突(相同)。 1996年在MD5算法中发现a flaw,密码分析者建议改用SHA-1哈希算法。

      因此,我建议您切换到 SHA-1(40 个字符)。但别担心:我怀疑你的两张照片会得到相同的哈希值。我认为您可以在您的应用程序中承担这种风险。

      【讨论】:

        【解决方案7】:

        正如其他人之前所说。哈希不会给你你需要的东西,除非你能承受碰撞的风险。

        数据库在这里很有帮助。 您将获得每个 200 长字符串的唯一索引。这里没有冲突,您需要将 200 个长名称设置为索引,这样它会使用额外的内存,但它会为您进行排序,使搜索非常快速。您将获得可轻松用于文件名的唯一 ID。

        【讨论】:

          【解决方案8】:

          我在散列算法上工作不多,但据我了解,散列算法总是有可能发生冲突,即两个不同的对象可能被散列到相同的散列值,但可以保证每次对象都会被散列到相同的哈希值。还有其他技术可以用于此,例如线性探测。

          【讨论】:

            猜你喜欢
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-01
            • 1970-01-01
            • 2011-04-30
            相关资源
            最近更新 更多