python - 在 Python 中获取大文件的 MD5 哈希

我用过 hashlib (在 Python 2.6/3.0 中替换 md5 ),如果我打开一个文件并将其内容放入 hashlib.md5() 中,它工作正常。功能。

问题在于非常大的文件,它们的大小可能超过 RAM 大小。

如何在不将整个文件加载到内存的情况下获取文件的 MD5 哈希?

最佳答案

您需要以合适大小的 block 读取文件:

def md5_for_file(f, block_size=2**20):
    md5 = hashlib.md5()
    while True:
        data = f.read(block_size)
        if not data:
            break
        md5.update(data)
    return md5.digest()

注意:确保打开文件时使用“rb”打开 - 否则会得到错误的结果。

所以要用一种方法完成所有工作 - 使用类似的方法:

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 )
    return m.hexdigest()

以上更新基于 the comments provided by Frerich Raabe - 我对此进行了测试,发现它在我的 Python 2.7.2 Windows 安装中是正确的

我使用 jacksum 交叉检查了结果工具。

jacksum -a md5 <filename>

https://stackoverflow.com/questions/1131220/

相关文章:

python - 您需要安装 postgresql-server-dev-X.Y 来构建服务器端扩展

python - 如何在 python-3.x 中使用字典格式化字符串?

python - 如何使用 open with 语句打开文件

linux - 从ssh注销后如何使程序继续运行?

linux - 好的 Linux (Ubuntu) SVN 客户端

python - 如何打印字典的键?

python - 在 Python 中写入 UTF-8 文件

python - 为什么我不能在 python 中创建一个轮子?

linux - 确定 Linux 二进制文件的直接共享对象依赖关系?

python - super() 失败并出现错误 : TypeError "argument 1 m