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

Max*_*ams 3 hash md5

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

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

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

Joh*_*hnB 7

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

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


Wid*_*dor 6

当进行散列(而不是加密)时,您正在减少被散列数据的信息空间,因此始终存在冲突的可能性.

在散列函数中你可以期望的最好的是所有散列均匀地分布在散列空间中,并且你的散列输出足够大,以提供你的"每10年一次的宇宙年龄的交易"作为你把它!

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

  • 好吧,如果您希望能够仅从数据源计算代码,则不能.如果您可以使用唯一ID,则可能不需要哈希. (2认同)