我正在编写一个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列表慢,但在处理数十亿个文件时没有足够的内存。
答案 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()