问题:文件名将导致不同的哈希值,即使文件内容相同
发现错误在MD5缓冲区中的问题。我们需要为每个文件声明一个新的哈希。它正在更新,之前的哈希流是来自之前的哈希。上传了一个工作版本,将清除所有重复文件。
我正在尝试查找目录下的所有重复文件,并删除所有重复文件(按其哈希值)并留下一个唯一文件。
我正在使用rb
打开文件并使用md5获取每个文件的hexdigest,但我发现具有不同名称的文件将散列出不同的值,即使文件的内容是相同。在尝试散列声音文件时也是如此,可能是因为根据声音片段的文件名存在不同的ID3标头。
有没有办法在不考虑文件名的情况下验证每个文件内容的完整性?
我在这里发布了我的小个人脚本http://pastebin.com/YZYXKMpt
结果:相同的哈希值。不同:(
>>> md5("C:\\Users\\c\\Documents\\Test\\06 Liar Liar.mp3")
'f9c50701d728c87cd959e8b7c6e7ebb2'
>>> md5("C:\\Users\\c\\Documents\\Test\\06 Liar Liar - Copy.mp3")
'f9c50701d728c87cd959e8b7c6e7ebb2'
>>> sha1("C:\\Users\\c\\Documents\\Test\\06 Liar Liar - Copy.mp3")
'68dcad808ab68e6b1f8610d21e92944ceb45086f'
>>> sha1("C:\\Users\\c\\Documents\\Test\\06 Liar Liar.mp3")
'68dcad808ab68e6b1f8610d21e92944ceb45086f''
{'C:\\Users\\c\\Documents\\Test\\06 Liar Liar.mp3': 'c7c8c7f9791804d3e1951bebb5d1494025da458c',
'C:\\Users\\c\\Documents\\Test\\06 Liar Liar - Copy.mp3': '64097f07a8c40488a74fb98a4b9e83d7e7885f6c',
'C:\\Users\\c\\Documents\\Test\\06 Liar Liar - Copy (2).mp3': '68dcad808ab68e6b1f8610d21e92944ceb45086f'}
答案 0 :(得分:0)
应为每个唯一文件重新实例化Hasher。不应该使用一个md5哈希对象来执行每个哈希,否则哈希流将从先前的文件哈希值构建变量。
for i,files_in_folder in enumerate(all_files_in_all_folders):
# Incase files are too large for memory, we will read 1mb increments
block_size = 2**20
# Iterate through each folder to read each file
for each_file in files_in_folder:
# Hasher will get the hash value of each files in this folder
hasher = hashlib.md5()
# Now i'm opening every file to get it's hash value below
with open(subfolder_paths[i][0]+"\\"+each_file, 'rb') as to_check_for_duplicates:
# We send large files bits by bits to the hasher so we can read larger files
while True:
file_buffer = to_check_for_duplicates.read(block_size)
# If we have reached the end of the file, we break out
if not file_buffer:
break
# Updating the hasher everytime we feed more bytes
hasher.update(file_buffer)
# Effectivley putting each hash hex value into a dictionary with the filepath and key
the_hash_dictionary[subfolder_paths[i][0]+"\\"+each_file] = hasher.hexdigest()