gpt4 book ai didi

python - Hashlib 的 md5 对于相同的输入产生不同的输出

转载 作者:行者123 更新时间:2023-12-01 09:31:32 25 4
gpt4 key购买 nike

我正在尝试编写一个脚本,为指定根目录中的所有文件名和目录名生成哈希值。到目前为止,这是我的脚本:

import hashlib
import os
import sys

class Hasher:
def __init__(self):
self.hash_func = hashlib.md5()

def hash_file(self, file_path):
with open(file_path, "rb") as file:
self.hash_func.update(file.read())
return self.hash_func.digest()

def hash_dir(self, dir_path):
for dirpath, dirnames, filenames in os.walk(dir_path):
self.hash_func.update(dirpath.encode("utf-8"))
for file_path in filenames:
self.hash_func.update(file_path.encode("utf-8"))
return self.hash_func.digest()

hasher = Hasher()
root_dir = "D:/folder/"
hash_1 = str(hasher.hash_dir(root_dir))
hash_2 = str(hasher.hash_dir(root_dir))
print(hash_1)
print(hash_2)

由于某种原因,它为同一目录生成两个不同的哈希值,而目录没有任何更改。如果目录保持不变,如何才能生成相同的哈希值?

最佳答案

问题在于 hashlib.md5 对象每次都会被重用,因此您返回累积数据的哈希值,而不仅仅是最后/预期数据的哈希值。

您可以通过每次创建一个新的 Hasher 对象来解决此问题(因此在本例中调用 Hasher().hash_dir(root_dir) 两次)。但是,由于您的 Hasher 类除了 md5 对象和两个可能是静态的方法之外不包含任何其他数据,因此我建议将这两个类方法设为静态,并创建方法本身中的 hashlib.md5 对象:

import hashlib
import os


class Hasher:

@staticmethod # make it a static method
def hash_file(file_path): # no 'self' as first argument
hash_func = hashlib.md5() # create the hashlib.md5 object here
with open(file_path, "rb") as file:
hash_func.update(file.read())
return hash_func.digest()

@staticmethod # make it a static method
def hash_dir(dir_path): # no 'self' as first argument
hash_func = hashlib.md5() # create the hashlib.md5 object here
for dirpath, _, filenames in os.walk(dir_path):
hash_func.update(dirpath.encode("utf-8"))
for file_path in filenames:
hash_func.update(file_path.encode("utf-8"))
return hash_func.digest()


def main():
root_dir = "D:/folder/"
hash_1 = str(Hasher.hash_dir(root_dir))
hash_2 = str(Hasher.hash_dir(root_dir))
print(hash_1)
print(hash_2)


if __name__ == "__main__":
main()

关于python - Hashlib 的 md5 对于相同的输入产生不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49927106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com