使用变量在Python中递归地散列文件会产生虚假散列

时间:2015-07-08 21:24:32

标签: python hash md5

我正在尝试使用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循环以使其正常工作?

2 个答案:

答案 0 :(得分:0)

尝试

md5_hash = hashlib.md5()

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

答案 1 :(得分:0)

您永远不会重置哈希对象,即您计算所有文件的串联哈希值。尝试将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')应该没有额外的系统调用(并且在出现错误时可能存在不确定状态)。