File 如何在不相互比较的情况下发现相同的文件?

File 如何在不相互比较的情况下发现相同的文件?,file,comparison,statistics,hash-collision,unique,File,Comparison,Statistics,Hash Collision,Unique,我正在建立一个网站,用户可以上传内容。和往常一样,我的目标是在世界上占据主导地位,所以我希望避免将同一个文件存储两次。 例如,如果一个用户试图上传同一个文件两次(通过重命名或忘记她过去所做的事情) 我目前的做法是让跟踪每个上传文件的数据库存储关于每个文件的以下信息: 文件大小(字节) MD5文件内容的总和 SHA1文件内容的总和 然后在这三列上创建一个唯一的索引。使用两个哈希值将误报风险降至最低 因此,我的问题是:相同大小的两个不同(“现实世界”)文件具有相同MD5和SHA1散列的概率是多少

我正在建立一个网站,用户可以上传内容。和往常一样,我的目标是在世界上占据主导地位,所以我希望避免将同一个文件存储两次。 例如,如果一个用户试图上传同一个文件两次(通过重命名或忘记她过去所做的事情)

我目前的做法是让跟踪每个上传文件的数据库存储关于每个文件的以下信息:

  • 文件大小(字节)
  • MD5文件内容的总和
  • SHA1文件内容的总和
然后在这三列上创建一个唯一的索引。使用两个哈希值将误报风险降至最低

因此,我的问题是:相同大小的两个不同(“现实世界”)文件具有相同MD5和SHA1散列的概率是多少?

或者:有没有类似(联合国)复杂度的更聪明的方法?

(我知道概率可能取决于文件大小)

谢谢

我认为存储MD5和SHA1散列会增加不必要的复杂性,这不是好的设计。我想说存储(SHA1,文件大小)的元组已经足够好了。特别是如果你正在创建一个新的社区站点,我会安全地使用这个解决方案,并且只在它成为问题时创建一些更聪明的东西。俗话说,过早优化是万恶之源,如果它是“优化”的话,这是有争议的


编辑:我没有量化你发生MD5+SHA1碰撞的几率。我想是零。通过粗略的、信封背面的计算,任意文件大小的两个不同文件具有相同(SHA1,MD5)元组的几率为2^-288,就我而言,这是零。必须要求相同的文件大小会进一步减少这一点

出于所有实际目的,具有相同大小的两个真实文件具有相同SHA1哈希的概率为零。已经发现了SHA1中的一些弱点,但是从SHA1散列和大小(1)创建文件是在计算能力方面,(2)产生垃圾或原始文件

向混合物中添加MD5完全是过火了。如果您不信任SHA-1,那么更好的选择是切换到


如果你真的很偏执,试着比较具有相同(大小,SHA1)签名的文件。但是,如果两个文件相等,则必须完全读取它们。

您可以使用Broders实现的Rabin指纹算法。 它的计算速度比sha1和md5快,并且被证明是抗碰撞的。 然而,它被认为是不安全的恶意攻击,有可能有人有目的地改变有问题的文件,而不是改变指纹本身。 如果您只想检查文件的相似性,这是一个很好的解决方案

C#实施,未测试:


当它成为一个问题时,您已经丢失了用户数据,因此对于更聪明的东西来说为时已晚;最初的问题是关于跳过内容比较而只使用哈希信息是否可行。-1,OP要求通过使用两个哈希来量化误报风险,但你告诉他只使用一个哈希,而不量化任何内容。这并不能很好地回答这个问题。谢谢你量化了双重碰撞的风险。现在我相信这两个哈希加上文件大小就足够我的应用程序了。我没有意识到我是偏执狂。我只是觉得这样可以消除碰撞的风险。旧习难改;我只从MD5 sum开始。因此,这就被认为是过度杀戮。话题不是安全。这是可能的,所以我不担心有人故意制作一个冲突的文件。我只想能够不说谎地说:“不,谢谢,已经收到了”。