【问题标题】:Using variable to recursively hash files in Python gives false hash在 Python 中使用变量递归散列文件会产生错误散列
【发布时间】:2015-09-27 00:53:00
【问题描述】:

我正在尝试使用 Python 以递归方式打印目录中文件的 md5 哈希,但我的 open 命令中的变量产生错误哈希时遇到问题。这是我的代码:

import os
import hashlib

blocksize = 65536
md5_hash = hashlib.md5()

for root, dirs, files in os.walk('/path/to/folder'):
    for filename in files:
        os.chdir(root)
        with open(filename, 'rb') as cur_file:
            print filename
            while True:
                data = cur_file.read(blocksize)
                if not data:
                    break
                md5_hash.update(data)
        print md5_hash.hexdigest()  

如果我将“文件名”变量更改为特定文件,如下所示:

with open('nameoffile.txt', 'rb') as cur_file:

然后产生了正确的哈希值,这让我相信我的 for 循环在某种程度上是错误的。我在正确的轨道上吗?我可以做些什么来修复变量或 for 循环以使其正常工作?

【问题讨论】:

  • 您想要 individual 文件的 md5 吗?因为目前你的代码会计算所有文件串联的 md5。

标签: python hash md5


【解决方案1】:

您永远不会重置哈希对象,即您计算所有文件连接的哈希值。尝试将md5_hash = hashlib.md5() 移动到循环中:

for root, dirs, files in os.walk('/path/to/folder'):
    for filename in files:
        md5_hash = hashlib.md5()
        os.chdir(root)
        with open(filename, 'rb') as cur_file:
            print filename
            while True:
                data = cur_file.read(blocksize)
                if not data:
                    break
            md5_hash.update(data)
        print md5_hash.hexdigest()

另外:为什么是 chdir? open(os.path.join(root, filename), 'rb') 应该可以在没有额外的系统调用的情况下正常工作(以及在发生错误时可能处于不确定状态)。

【讨论】:

  • 这成功了!啊,如此简单却如此有效。 os.chdir(root) 只是旧脚本的习惯(以及一些懒惰的脚本)。我还没有完全掌握 os.path.join 的概念,所以我倾向于回到旧习惯以使事情快速运行。
【解决方案2】:

尝试做

md5_hash = hashlib.md5()

在你完成一个文件的散列之后,因为你当前正在更新同一个文件...

【讨论】:

  • 这正是我必须做的。谢谢!
猜你喜欢
  • 2018-03-09
  • 2023-03-23
  • 2011-07-20
  • 2014-03-30
  • 2015-03-13
  • 2018-06-16
  • 2019-12-23
  • 2015-10-25
  • 2010-12-23
相关资源
最近更新 更多