【问题标题】:Calculate MD5 and SHA1 simultaneously on large file在大文件上同时计算 MD5 和 SHA1
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 感谢代码 sn-p!将实施它并对结果进行计时,以查看它与使用 filecmp.cmp 的比较。应该更快...
猜你喜欢
  • 2015-05-03
  • 2012-12-02
  • 1970-01-01
  • 2017-06-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2017-08-13
相关资源
最近更新 更多