在大文件上同时计算MD5和SHA1

时间:2017-06-28 13:21:35

标签: python hash md5 sha1 crc32

我正在编写一个Python程序来查找重复文件。计算MD5和比较文件大小不是100%万无一失,因为两个不同的文件可能具有相同的文件大小和MD5(碰撞概率2 ^ 128)。

我当时想知道,也许如果我添加另一个散列,如SHA1(2 ^ 160)或CRC32(2 ^ 32)混合,这将大大提高识别唯一文件的能力,即比较MD5和SHA1一个文件的唯一性? SHA1或CRC32是否适用于此次要检查?

如果是这样,我如何同时计算MD5和SHA1 / CRC32,同时迭代一个非常大的文件的1MB块,以避免读取大文件两次?这就是我对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列表慢,但在处理数十亿个文件时没有足够的内存。

1 个答案:

答案 0 :(得分:2)

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

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()