【问题标题】:Chunked and Total MD5 Calculation in Python [duplicate]Python中的分块和总MD5计算[重复]
【发布时间】:2016-02-26 00:09:48
【问题描述】:

我有一个大文件,我将使用 Python 分块上传。每个块约为 4MB,文件可能非常大。我想(最有效地)计算每个块的 MD5 值以及整个文件的 MD5。我完全理解如何根据hashlib reference docs 和其他关于有效calculating MD5 values for large files 的stackoverflow 问题计算MD5。

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

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

【问题讨论】:

  • 您是否分析过您的代码以查看这是否真的是某种瓶颈?我假设磁盘访问成本将使 md5sum 成本相形见绌
  • 它会的,很多事情会让成本相形见绌。但是磁盘成本不是我可以改变的,而 MD5 可以。在做和不做 MD5 之间,我们确实看到了区别。如果有办法对此进行优化,为什么不考虑呢?
  • 呸,公平点...但是没有办法组合 md5 以获得整个语料库返回的相同 md5
  • 认为可能是这种情况,但我对 MD5 算法本身不够熟悉,无法知道是否有某种方法可以散列组件。哦,好吧。

标签: python md5


【解决方案1】:

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

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

【讨论】:

  • 要给这个+1,因为我很欣赏代码尽了最大努力(即,不会做不可能重用块 md5s,但可能是我们能做的最好的),我认为这是在 StackOverflow 上很有价值。然后为了后代,我将我自己的问题标记为重复,因为我有效地找到了一个答案,告诉我我想要做什么是不可能的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2015-02-01
  • 2019-02-21
相关资源
最近更新 更多