Коллизии MD5 и SHA-2 в Python

Я пишу простой каталогизатор MP3, чтобы отслеживать, какой MP3 ' s есть на разных моих устройствах. Я планировал использовать ключи MD5 или SHA2 для идентификации совпадающих файлов, даже если они были переименованы / перемещены и т. Д. Я не пытаюсь сопоставить MP3, которые логически эквивалентны (то есть: одна и та же песня, но закодирована по-разному). У меня около 8000 MP3. Только около 6700 из них сгенерировали уникальные ключи.

Моя проблема в том, что я сталкиваюсь с коллизиями независимо от выбранного мной алгоритма хеширования. В одном случае у меня есть два файла, которые являются треками №1 и №2 в одном альбоме, они имеют разные размеры, но создают одинаковые хеш-ключи, независимо от того, использую ли я MD5, SHA2-256, SHA2-512 и т. Д.

Я впервые действительно использую хеш-ключи для файлов, и это неожиданный результат. Я чувствую, что здесь происходит что-то подозрительное из того немногое, что я знаю об этих алгоритмах хеширования. Может быть, это проблема с MP3? s или реализация Python?

Вот фрагмент кода, который я использую:

    data = open(path, 'r').read()

    m = hashlib.md5(data)

    m.update(data)

    md5String = m.hexdigest()

Мы будем очень признательны за любые ответы или идеи о том, почему это происходит. Заранее спасибо.

- ОБНОВЛЕНИЕ - :

Я попытался выполнить этот код в Linux (с Python 2.6), но столкновения не возникло. Как показывает вызов stat, файлы не совпадают. Я также загрузил WinMD5, и это не привело к конфликту (8d327ef3937437e0e5abbf6485c24bb3 и 9b2c66781cbe8c1be7d6a1447994430c). Это ошибка хэш-библиотеки Python в 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
7
задан Jesse 26 April 2011 в 10:53
поделиться