【发布时间】:2009-11-17 13:36:40
【问题描述】:
在这种情况下对“md5sum file1”和“md5sum file2”进行系统调用并比较两个返回值是否足够?
【问题讨论】:
在这种情况下对“md5sum file1”和“md5sum file2”进行系统调用并比较两个返回值是否足够?
【问题讨论】:
嗯,这会告诉你它们是绝对不同还是可能相同。 可能两个文件具有相同的散列但实际上不具有相同的数据...只是不太可能。
在您的情况下,如果您得到误报(即,如果您认为它们相同,但事实并非如此)会有什么影响?如果冲突只会意外发生,MD5 可能就足够了,不用担心冲突......但如果你的安全(或金钱)处于危险之中,并且有人可能会用与“好”文件相同的哈希,你不应该依赖它。
就个人而言,我可能只是读取两个文件,比较每个字节 - 对于一次性比较,散列和这种方法都需要在它们相等时读取整个文件;正如 Daniel 在 cmets 中指出的那样,进行逐字节比较可以让您在看到差异时尽早退出。首先比较文件大小是另一个快速优化:)
当您将现有文件的哈希存储在某处时,散列的一般优势就会出现,这样下次您可以只需读取新文件。
【讨论】:
如果您要缓存它(用于比较许多不同的文件),哈希是很有用的。如果您只想比较两个文件,那将是极大的浪费周期。毕竟 - 这两个文件都会被读入,并且每一口都会使用大量的处理。
如果是 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.
【讨论】:
当然,在比较文件内容之前,您应该做一个简单的测试 - 如果文件大小不同,那么它们不可能相同。
简单地读取每个文件并进行逐字节比较,完全避免散列算法不是更有效吗?这避免了两个不同文件产生相同 MD5 哈希的(非常不可能的)机会。此外,当检测到第一个差异时,您可以退出比较,这对于非常不同的文件将在比较的早期进行(可能在第一个字节上!)
【讨论】:
如果您使用的是带有 md5sum 的系统,那可能就足够了。
您可以使用 Python 标准库来做到这一点——查看hashlib。
【讨论】:
取决于您是否对 MD5 算法的碰撞概率感到满意。请注意这是极不可能的:所以是的,继续。
【讨论】:
如果没有人恶意尝试创建冲突,那么您必须比较大约 264 个文件,然后才能看到 collision by random chance。但是,由于cryptographic weaknesses in MD5,有人可能会仔细构建具有相同 MD5 和的两个文件。 MD5 的加密弱点是否重要取决于您的应用程序、文件的来源以及如果攻击者欺骗您的程序认为两个不同的文件是相同的,他可以获得什么。 MD5 仍然是一个非常好的校验和,只是不如加密哈希那么好。
【讨论】:
是的,够了
【讨论】: