Python 中的分块和总 MD5 计算

  • 本文关键字:MD5 计算 Python python md5
  • 更新时间 :
  • 英文 :


我有一个大文件,我将使用Python分块上传。每个块将是~4MB,文件可能非常大。我想(最有效地)计算每个块的 MD5 值以及整个文件的 MD5。我完全了解如何根据哈希库参考文档和其他堆栈溢出问题计算 MD5,以有效计算大文件的 MD5 值。

我看到的最简单的解决方案是为每个块提供一个 hashlib.md5() 实例,为总数据提供一个实例。但是,这意味着有效地对完整数据运行两次 md5 算法并进行大量消化。我可以通过在处理第一个块后对第一个 hashlib.md5() 值调用 copy() 来稍微优化这一点,但在那之后,我看不到如何更有效地做到这一点。

有没有更好的方法,我可以使用 Python 将每个块的 MD5 值基本上合并为完整文件的总 MD5?

您可以在链接的其他线程中修改答案

def generate_file_md5(rootdir, filename, blocksize=2**20):
    m = hashlib.md5()
    with open( os.path.join(rootdir, filename) , "rb" ) as f:
        while True:
            buf = f.read(blocksize)
            if not buf:
                break
            m.update( buf )
            yield(hashlib.md5(buf).hexdigest())
    yield m.hexdigest()

这会在迭代时为整个文件保留运行 MD5 总数,因此您至少只迭代一次文件内容

(请注意,你会这样称呼它)

md5s = list(generate_file_md5("/path/","file.txt",chunksize))
md5s[-1] # the whole file checksum
md5s[:-1] # the partial md5s

最新更新