【问题标题】:How to detect whether two files are identical in Python [duplicate]如何在Python中检测两个文件是否相同[重复]
【发布时间】:2009-11-17 13:36:40
【问题描述】:

在这种情况下对“md5sum file1”和“md5sum file2”进行系统调用并比较两个返回值是否足够?

【问题讨论】:

    标签: python file md5 compare


    【解决方案1】:

    如果您想做的不仅仅是检测它们是否不同,或者不信任散列解决方案,标准库中有名为 difflibfilecmp 的模块不依赖外部程序。

    【讨论】:

    • 只需阅读 filecmp 的文档 - 这对于 Python 应用程序来说似乎是正确的方法。我喜欢“除非它们的 os.stat() 签名发生变化,否则不会再次比较使用此函数比较的文件”的想法。毫无疑问, filecmp.cmp() 函数比滚动自己的函数更有效。我认为这应该是公认的答案...
    【解决方案2】:

    嗯,这会告诉你它们是绝对不同还是可能相同。 可能两个文件具有相同的散列但实际上不具有相同的数据...只是不太可能。

    在您的情况下,如果您得到误报(即,如果您认为它们相同,但事实并非如此)会有什么影响?如果冲突只会意外发生,MD5 可能就足够了,不用担心冲突......但如果你的安全(或金钱)处于危险之中,并且有人可能会用与“好”文件相同的哈希,你不应该依赖它。

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

    当您将现有文件的哈希存储在某处时,散列的一般优势就会出现,这样下次您可以只需读取新文件。

    【讨论】:

    • 取决于来源。如果存在信任/安全问题,并且您不能依赖文件创建者的良好意图,那么“不太可能”就不是合适的词。
    • @MSalters:确实,会详细说明。
    • 曾经有一位“大学讲师”明确告诉我,没有两个文件可以具有相同的 md5 并且数据内容不同。
    • @Jon,感谢您的解释。如何生成文件的哈希值? hashlib 看起来只适用于字符串。
    • “散列法和这种方法都需要读取整个文件”——只有在文件相同的情况下才会如此。如果您自己进行比较,您可以在文件不同的情况下尽早退出。这是不使用 MD5 方法的充分理由(如我的回答中所述!)。
    【解决方案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.
    

    【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 我同意。简单的 filecmp 会比计算 HASH 更快。
    【解决方案5】:

    如果您使用的是带有 md5sum 的系统,那可能就足够了。

    您可以使用 Python 标准库来做到这一点——查看hashlib

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          是的,够了

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-11
            • 1970-01-01
            • 2016-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-10
            相关资源
            最近更新 更多