【发布时间】:2017-12-01 21:24:57
【问题描述】:
我正在编写一个 Python 程序来查找重复文件。计算 MD5 和比较文件大小并非 100% 万无一失,因为两个不同的文件可能具有相同的文件大小和 MD5(冲突概率 2^128)。
那时我想知道,也许如果我添加另一个哈希值,例如 SHA1 (2^160) 或 CRC32 (2^32),会大大提高识别唯一文件的能力,即比较 MD5 和 SHA1文件的唯一性? SHA1 或 CRC32 更适合这种二次检查吗?
如果是这样,我如何在遍历一个非常大的文件的 1MB 块时同时计算 MD5 和 SHA1/CRC32 以避免读取大文件两次?这就是我的 MD5:
def md5(fname):
hash_md5 = hashlib.md5()
with open(fname, "rb") as f:
for chunk in iter(lambda: f.read(2 ** 20), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
目前,我的代码在检查相同的 MD5 后,将在两个文件上运行 filecmp.cmp 作为最终检查。这显然是资源密集型的,效率不高。
我正在使用 SQLite 来存储这些哈希值。我认为它比 Python 列表慢,但在处理数十亿个文件时不会受到内存不足的影响。
【问题讨论】:
-
2^128 具有误导性,但实际发生冲突的概率足够小,您无需担心,MD5 很好(适用于非敏感应用程序)stackoverflow.com/questions/4032209/… / crypto.stackexchange.com/questions/12677/…
-
感谢您的评论。对于拥有 500+GB 照片图像的人来说,“足够小”的概率不足以通过排序并消除重复。想知道 SHA1/CRC32 是否足以“保证”这一点。也许 filecmp.cmp 是唯一的万无一失的方法......
-
使用两个散列函数应该让你有足够的把握可以安然入睡;)
标签: python hash md5 sha1 crc32