如何检测Python中的两个文件是否相同

时间:2009-11-17 13:36:41

标签: python file md5 compare

系统调用“md5sum file1”和“md5sum file2”并在这种情况下比较两个返回值吗?

8 个答案:

答案 0 :(得分:13)

那么,这会告诉你他们是否完全不同或可能相同。 可能两个文件具有相同的哈希但实际上没有相同的数据......只是非常不可能。

在你的情况下,如果你得到假阳性会有什么影响(即如果你认为它们是相同的,但它们不是)? MD5可能足够好,不会担心碰撞,如果它们只是偶然发生 ......但是如果你有安全(或金钱)岌岌可危,有人可能会制作一个“坏”文件与“好”文件相同的哈希值,你不应该依赖它。

就我个人而言,我可能只是读取两个文件,比较每个字节 - 对于一次性比较,散列和这种方法都需要在它们相等时读取整个文件;正如Daniel在评论中指出的那样,进行逐字节比较可以让您在看到差异后立即退出。首先比较文件大小是另一种快速优化:)

当您将现有文件的哈希存储在某处时,会发生散列的一般优势,以便下次读取新文件时。

答案 1 :(得分:12)

如果您想做的不仅仅是检测它们是否不同,还是不信任散列解决方案,那么有一些名为difflibfilecmp的模块不依赖于外部程序。< / p>

答案 2 :(得分:7)

当然,在比较文件内容之前应该进行一项简单的测试 - 如果文件大小不同,那么它们可能不一样。

简单地读取每个文件并进行逐字节比较是不是更有效,完全避免了散列算法。这避免了两个不同文件产生相同MD5哈希的可能性(非常不可能)。此外,当检测到第一个差异时,您可以摆脱比较,对于非常不同的文件,在比较的早期(可能在第一个字节!)

答案 3 :(得分:3)

如果你在使用md5sum的系统上,这可能就足够了。

您可以使用Python标准库执行此操作 - 结帐hashlib

答案 4 :(得分:3)

如果要对其进行缓存(将许多不同的文件与其他文件进行比较),则哈希非常有用。如果你只是想比较两个文件,这是一个巨大的周期浪费。毕竟 - 两个文件都将被读入,并且每一口都将使用大量处理。

如果是1比1的比较,只需使用:

import filecmp
filecmp.cmp(file_name_1,file_name_2)

另一方面,良好的哈希是将个文件与其他文件进行比较的唯一方法。

SHA-1和MD5类型已损坏 - 但不适用于普通文件。一些研究人员可以生成2个可能发生冲突的无意义文件,但任何人都不可能破坏现有文件。

git使用SHA-1来比较文本,所以这不是一个糟糕的选择。

以下一切都有效:

import hashlib
hash = hashlib.MD5(your_text_here).hexdigest() # safe*
hash = hashlib.SHA1(your_text_here).hexdigest() # safe*
hash = hashlib.SHA224(your_text_here).hexdigest() # safe
hash = hashlib.SHA512(your_text_here).hexdigest() # paranoid

# now put the hash in a dictionary (or database) for your many-to-many comparison.

#  * Meaningful files will not be clobbered. Contrived files can be generated
#    which might clash together, but it's difficult to do.

答案 5 :(得分:0)

取决于您对MD5算法的碰撞概率感到满意。请注意,这是极不可能的:所以是的,继续。

答案 6 :(得分:0)

如果没有人恶意尝试创建冲突,那么在您希望看到collision by random chance之前,您必须比较大约2个 64 文件。但是,由于cryptographic weaknesses in MD5,有人可能会仔细构建具有相同MD5总和的两个文件。 MD5的加密弱点是否重要取决于您的应用程序,文件来自哪里,以及如果攻击者欺骗您的程序认为两个不同的文件是相同的,那么攻击者可以获得什么。 MD5仍然是一个非常好的校验和,只是不如加密哈希那么好。

答案 7 :(得分:-2)

是的,这已经足够了