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

jac*_*ack 6 python md5 compare file

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

Jon*_*eet 13

那么,这将告诉你他们是否肯定不同或可能是相同的.这是可能的两个文件具有相同的哈希但实际上没有具有相同的数据...只是不太可能.

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

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

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


Mat*_*son 13

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


wis*_*sty 11

如果您要缓存它(将许多不同的文件相互比较),则哈希很有用。如果你只是想比较两个文件,那就是对循环的巨大浪费。毕竟 - 两个文件都将被读入,并且每一口都将进行大量处理。

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

import filecmp
filecmp.cmp(file_name_1,file_name_2)
Run Code Online (Sandbox Code Playgroud)

另一方面,良好的散列是将大量文件相互比较的唯一方法。

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.
Run Code Online (Sandbox Code Playgroud)


Dan*_*ull 7

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

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