使用python by md5获取二进制文件的哈希值,尝试清除重复项

时间:2013-12-19 19:08:19

标签: python file md5

问题:文件名将导致不同的哈希值,即使文件内容相同


发现错误在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'}

1 个答案:

答案 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()