对大文件同时计算 MD5 和 SHA1

Calculate MD5 and SHA1 simultaneously on large file

我正在编写一个 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 列表慢,但在处理数十亿个文件时不会遇到内存不足的问题。

您已经完成了最难的部分。你只需要将你读取的块提供给另一个哈希器:

def calculate_hashes(fname):
    hash_md5 = hashlib.md5()
    hash_sha1 = hashlib.sha1()
    with open(fname, "rb") as f:
        for chunk in iter(lambda: f.read(2 ** 20), b""):
            hash_md5.update(chunk)
            hash_sha1.update(chunk)
    return hash_md5.hexdigest(), hash_sha1.hexdigest()