我有一个大文件,我将使用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