Я пишу простой каталогизатор MP3, чтобы отслеживать, какие MP3 есть на моих различных устройствах. Я планировал использовать ключи MD5 или SHA2 для определения совпадающих файлов, даже если они были переименованы / перемещены и т. Д. Я не пытаюсь сопоставить MP3-файлы, которые логически эквивалентны (т. Е. Одна и та же песня, но кодируется по-разному). У меня около 8000 MP3. Только около 6700 из них генерировали уникальные ключи.
Моя проблема в том, что я сталкиваюсь с коллизиями независимо от выбранного мной алгоритма хеширования. В одном случае у меня есть два файла, которые являются треками № 1 и № 2 в одном альбоме, они имеют файлы разных размеров, но при этом выдают идентичные хэш-ключи, использую ли я MD5, SHA2-256, SHA2-512 и т. Д.
Это первый раз, когда я действительно использую хеш-ключи для файлов, и это неожиданный результат. Я чувствую, что здесь происходит что-то подозрительное из того, что я знаю об этих алгоритмах хеширования. Может ли это быть проблемой, связанной с реализацией MP3 или Python?
Вот фрагмент кода, который я использую:
data = open(path, 'r').read()
m = hashlib.md5(data)
m.update(data)
md5String = m.hexdigest()
Буду очень признателен за любые ответы или идеи о том, почему это происходит. Заранее спасибо.
- ОБНОВЛЕНИЕ -
Я попытался выполнить этот код в Linux (с Python 2.6), и он не вызвал коллизию. Как показывает статистика, файлы не совпадают. Я также скачал WinMD5, и это не вызвало столкновения (8d327ef3937437e0e5abbf6485c24bb3 и 9b2c66781cbe8c1be7d6a1447994430c). Это ошибка с Python hashlib в Windows? Я попробовал то же самое в Python 2.7.1 и 2.6.6, и оба показали одинаковый результат.
import hashlib
import os
def createMD5( path):
fh = open(path, 'r')
data = fh.read()
m = hashlib.md5(data)
md5String = m.hexdigest()
fh.close()
return md5String
print os.stat(path1)
print os.stat(path2)
print createMD5(path1)
print createMD5(path2)
>>> nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=6617216L, st_atime=1303808346L, st_mtime=1167098073L, st_ctime=1290222341L)
>>> nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=4921346L, st_atime=1303808348L, st_mtime=1167098076L, st_ctime=1290222341L)
>>> a7a10146b241cddff031eb03bd572d96
>>> a7a10146b241cddff031eb03bd572d96