3

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

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

  • 两个~200 char bytearrays MD5-hash 到同一个字符串吗?
  • 如果可以的话,它是每 10 个宇宙时代一次的交易还是可以想象在我的应用程序中发生的事情?
  • 是否有一个哈希算法会产生一个(比如说)32个字符的字符串,保证是唯一的?
4

8 回答 8

8

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

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

于 2012-05-29T11:54:29.700 回答
6

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

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

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

于 2012-05-29T11:58:37.480 回答
4

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

于 2012-05-29T11:56:12.373 回答
4

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

这个数字对于SHA1是2 160 +1,对于SHA512是2 512 +1

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

于 2012-05-29T11:56:59.343 回答
3

两个~200 char bytearrays MD5-hash 到同一个字符串吗?

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

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

于 2012-05-29T11:55:52.343 回答
2

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

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

于 2013-01-10T09:40:37.020 回答
2

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

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

于 2012-05-29T11:53:44.390 回答
0

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

于 2012-05-29T12:06:03.217 回答