我看到一些帖子可以在目录中查找重复项并进行压缩:here,here和here,但是这些帖子都没有解释如何撤消该过程。
因此,在此过程之后,您将得到文件哈希,文件本身以及它们发生的位置。就我而言,我正在使用该算法在文件中查找重复项。从一个6 kB的文件,我减少到2 kB。当我尝试重建文件时,内容相同,但是文件大小和比较失败。
这是我的代码,用于重建我根据先前的post修改的文件:
import pickle
import hashlib
with open(compressed, 'rb') as f, open(recovered, "wb") as fname:
a_dict = pickle.load(f) # loads the compressed file
a_list = []
for values_list in a_dict.values():
file_bytes = values_list.pop(0)
for val in values_list:
a_list .insert(val, file_bytes)
result = tuple(a_list)
pickle.dump(result, fname, protocol=pickle.HIGHEST_PROTOCOL)
a_dict
在哪里
a_dict =
{'8a50b9f75b57104d89b58305d96045df':[b'\x94*\x08\x9d\xd8', 0, 1, 4, 6, 7],
'bff92f621cc65e2103305343a943c9a8':[b'\x85*\xe4\xf0\xd7', 2, 3, 5, 8, 9]}
同样,原始文件的内容和result
是相同的。但是,当我与Unix cmp file1 file2
比较时,甚至当我再次对文件进行哈希处理时,字节也不相同。
答案 0 :(得分:0)
在做的时候:
for values_list in a_dict.values():
会迭代这些值,但顺序可以在后续运行之间更改。这是Python 3哈希(哈希随机化,请阅读:Why is dictionary ordering non-deterministic?)函数的一项安全功能,该功能会更改(除非您使用环境变量对其进行修复)。
因此,您得到的列表数据(在a_list
中是相同的,但是顺序不同。我建议您在迭代以稳定它们时对这些值进行排序:
for values_list in sorted(a_dict.values()):
对于像您这样的本机python结构,我建议使用json
对其进行序列化。您可能会自己发现问题,看到内容没问题,只是顺序不同。