0

我想创建一个包含大量文件校验和的数据库,并且我担心校验和冲突(具有相同校验和的两个不同文件)。

问题1:两个不同文件具有相同MD5和的概率是多少?

作为一种解决方法,我考虑使用增加的校验和。从一个小的校验和开始,如果发生冲突,计算一个更大的校验和,该校验和可以导出到较小的校验和,所以我不必重新计算数据库中已经存在的所有文件的校验和......我仍然想成为能够搜索更小尺寸的校验和。

问题 2:哪种校验和/摘要算法可以做到这一点?我需要一个校验和算法,它可以计算一定大小的值并且“向后”兼容(较小的大小)。IE。file1 有一个 2 字节校验和 0x1234 和一个 4 字节校验和 0x12345678,2 字节校验和可以从 4 字节校验和导出。

4

2 回答 2

0

谷歌搜索“生日悖论”,并满足于知道这个数字是无法控制的巨大。碰撞的概率增加得相当快,但是对于像 SHA 或 MD 这样的东西,它不会对前两个的原始概率产生太大影响。

顺便说一句,如果这是出于加密目的,则不推荐使用 MD5。如果您只是重复数据删除之类的,MD5 应该没问题。

于 2012-06-28T20:34:37.720 回答
0

问题1:取决于你有多少文件。对于每一对,它大约是 2^128 中的 1 个。如果您有 2^64 个文件(我认为您可能没有),那么它们之间至少发生一次冲突的概率约为 0.5。

这假设制作文件的人没有恶意。有已知的 MD5 冲突,以及生成冲突文件的已知方法。如果有人可以通过将您暴露在碰撞中来赚钱,那么碰撞的概率接近 1 :-)

问题2:通常你会使用更好的散列开始(也许是SHA-256),然后你的“小”散列要么是大散列的前几个字节,要么是取模某个大数的第一个字节,也许一个素数。但这取决于你想要它做什么。

一个便宜而愉快的选择是“大”散列是两个或多个“小”散列连接在一起 - 例如,向前和向后散列文件。当然,一旦小散列被破坏,不知道该破坏是否会导致两个+散列组合的破坏。

于 2012-06-28T15:47:16.660 回答