使用变量递归散列 Python 中的文件会给出错误的散列
Using variable to recursively hash files in Python gives false hash
我正在尝试使用 Python 递归地打印目录中文件的 md5 哈希值,但我的打开命令中的变量产生错误哈希值时遇到问题。这是我的代码:
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()
如果我将 "filename" 变量更改为特定文件,如下所示:
with open('nameoffile.txt', 'rb') as cur_file:
然后生成了正确的散列,这让我相信我的 for 循环在某些方面有问题。我在正确的轨道上吗?我该怎么做才能修复变量或 for 循环以使其正常工作?
试试
md5_hash = hashlib.md5()
完成文件哈希后,因为您当前正在更新同一个文件...
您永远不会重置散列对象,即您计算所有文件串联的散列。尝试将 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')
在没有额外系统调用的情况下应该可以正常工作(并且在出现错误时可能会出现不确定状态)。
我正在尝试使用 Python 递归地打印目录中文件的 md5 哈希值,但我的打开命令中的变量产生错误哈希值时遇到问题。这是我的代码:
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()
如果我将 "filename" 变量更改为特定文件,如下所示:
with open('nameoffile.txt', 'rb') as cur_file:
然后生成了正确的散列,这让我相信我的 for 循环在某些方面有问题。我在正确的轨道上吗?我该怎么做才能修复变量或 for 循环以使其正常工作?
试试
md5_hash = hashlib.md5()
完成文件哈希后,因为您当前正在更新同一个文件...
您永远不会重置散列对象,即您计算所有文件串联的散列。尝试将 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')
在没有额外系统调用的情况下应该可以正常工作(并且在出现错误时可能会出现不确定状态)。