散列函数保证是唯一的吗?

时间:2012-05-29 11:48:46

标签: md5 hash

在我们的应用程序中,我们将发送png图像以及~200​​个字符的字节数组。我想用对应于该bytearray的文件名保存图像,但不是字节数组本身,因为我不想要200个字符的文件名。所以,我认为我会将bytearray保存到数据库中,然后MD5将其保存为短文件名。当需要显示特定图像时,我查找其bytearray,MD5,然后查找该文件。

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

  • 可以将两个~200个字节数组MD5 - 哈希下载到相同的字符串吗?
  • 如果他们可以的话,这是一个每10年一次的宇宙交易或可能会在我的应用程序中发生的事情吗?
  • 是否有一个哈希算法会产生(比方说)32字符串,该字符串保证是唯一的?

8 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

当进行散列(而不是加密)时,您正在减少被散列数据的信息空间,因此总是存在偶然的冲突。

散列函数中你最好的希望是所有散列均匀分布在散列空间中,你的散列输出足够大,可以提供“每10年一次的宇宙年龄”类型交易“就像你说的那样!

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

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

SHA1 2 512 +1 strong> for SHA512

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

答案 4 :(得分:3)

  

可以将两个~200个字节数组MD5散列到相同的字符串吗?

考虑到有超过200字节的字符串而不是32字节的字符串(MD5摘要),保证就是这种情况。

所有哈希函数都存在这个问题,但有些功能比MD5更强大。试试SHA-1。 git正在将它用于同一目的。

答案 5 :(得分:2)

可能会发生两个MD5哈希碰撞(相同)。 1996年,在MD5算法中发现a flaw,密码分析师建议切换到SHA-1哈希算法。

所以,我建议你切换到SHA-1(40个字符)。但不要担心:我怀疑你的两张照片会得到相同的哈希值。我认为您可以在申请中承担这一风险。

答案 6 :(得分:2)

正如之前所说的那样。哈希不会给你你需要的东西,除非你有可能发生碰撞。

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

答案 7 :(得分:0)

我在散列算法上没有做太多工作但是根据我的理解,在散列算法中总是存在碰撞的可能性,即两个不同的对象可能被散列到相同的散列值但是每次对象将被散列时都保证相同的哈希值。还有其他可用于此的技术,如线性探测。