【问题标题】:md5 hash of file calculated not correct in Python在 Python 中计算的文件的 md5 哈希不正确
【发布时间】:2016-08-06 15:46:31
【问题描述】:

我有一个函数可以计算驱动器中所有文件的 md5 哈希值。计算了一个哈希值,但它与我使用其他程序或为此设计的在线服务获得的哈希值不同。

def md5_files(path, blocksize = 2**20):
    hasher = hashlib.md5()
    hashes = {}
    for root, dirs, files in os.walk(path):
        for file in files:
            file_path = os.path.join(root, file)
            print(file_path)
            with open(file_path, "rb") as f:
                data = f.read(blocksize)
                if not data:
                    break
                hasher.update(data)
                hashes[file_path] = hasher.hexdigest()
    return hashes

提供的path 是驱动器号,例如“K:\”然后我浏览文件并打开文件进行二进制读取。我读取了blocksize 中指定大小的数据块。然后我将每个文件的文件名和 md5 哈希值存储在一个名为 hashes 的字典中。代码看起来不错,我还检查了 Stack Overflow 上的其他问题。不知道为什么生成的md5 hash是错误的。

【问题讨论】:

  • 您需要为每个文件创建一个新的hasher
  • 我可以重复使用同一个变量吗?例如,我可以将“hasher = hashlib.md5()”放在内部循环中吗?我的意思是,在“with”语句中

标签: python hash md5 hashlib


【解决方案1】:

您需要为每个文件构造一个新的 md5 对象并完全读取它。例如。像这样

def md5_files(path, blocksize = 2**20):    
    hashes = {}
    for root, dirs, files in os.walk(path):
        for file in files:
            file_path = os.path.join(root, file)
            print(file_path)
            with open(file_path, "rb") as f:
                data = f.read(blocksize)
                hasher = hashlib.md5(data)
                while data:
                    data = f.read(blocksize)   
                    hasher.update(data)             
                hashes[file_path] = hasher.hexdigest()
    return hashes

【讨论】:

  • 好的,我明白你的意思。您的代码中是否有重复的“data = f.read(blocksize)”分配?我在“with”语句中看到一个,在“while”循环中看到一个。
  • data 不能为空以进入 while 循环,一个简单的方法是在之前读取它。 (数据不仅被丢弃,而且在hashlib.md5(data)中使用)
  • 是的,我想我明白了。在进入while循环之前检查数据是对的,数据被hashlib.md5()用作参数。我正在考虑变量数据的范围。它是一个局部变量,它应该可以在函数 md5_files() 内的任何地方访问,所以我可以直接执行 hasher.update(data) 而无需再次执行 data = f.read(blocksize) 吗?
  • hmm,无论如何,如果我在“with语句”中删除“data = f.read(blocksize)”,它似乎就像一个无限循环,如果我确实像你说的那样,它会处理当前文件,然后移动到下一个文件。我不知道为什么,但似乎“with”语句中的“data = f.read(blocksize)”是必要的。
  • 我测试了这个功能,它可以工作。我会接受你的回答。谢谢你的帮助。
猜你喜欢
  • 2015-12-18
  • 2021-06-19
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2012-05-06
  • 1970-01-01
相关资源
最近更新 更多