Python中计算的文件md5哈希不正确
我有一个函数,用于计算驱动器中所有文件的md5哈希值。散列是经过计算的,但它不同于我使用其他程序或在线服务得到的散列Python中计算的文件md5哈希不正确,python,hash,md5,hashlib,Python,Hash,Md5,Hashlib,我有一个函数,用于计算驱动器中所有文件的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(
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
提供的
路径是驱动器号,例如“K:\”,然后我在文件中导航并打开文件进行二进制读取。我读取blocksize
中指定大小的数据块。然后我将每个文件的文件名和md5散列存储在名为散列的字典中。代码看起来不错,我还检查了关于堆栈溢出的其他问题。我不知道为什么生成的md5散列是错误的。您需要为每个文件构造一个新的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
您需要为每个文件创建一个新的hasher
。我可以重用相同的变量吗?例如,我可以将“hasher=hashlib.md5()”放在内部循环中吗?我的意思是,在“with”语句中,我明白你的意思。是否存在代码中不需要的重复“data=f.read(blocksize)”赋值?我在“with”语句中看到一个,在“while”循环中看到一个。进入while循环时,数据不能为空,一个简单的方法是先读取它。(数据不仅被丢弃,而且在hashlib.md5(数据)
中使用)是的,我想我理解。在进入while循环之前检查数据是正确的,hashlib.md5()将数据用作参数。我在考虑变量数据的范围。这是一个局部变量,应该可以在函数md5_files()中的任何位置访问它,所以我可以直接执行hasher.update(data),而不必再次执行data=f.read(blocksize)吗?嗯,无论如何,如果我在“with语句”中删除“data=f.read(blocksize)”,似乎有一个无限循环,如果我像你说的那样,它处理当前文件,然后移动到下一个文件。我不知道为什么,但“with”语句中的“data=f.read(blocksize)”似乎是必要的。我测试了这个函数,它正常工作了。我接受你的回答。谢谢你的帮助。