Хорошая идея - придерживаться MD5. Просто чтобы убедиться, что я добавлю длину файла или количество фрагментов в вашу таблицу хеш-файлов.
Да, есть вероятность, что вы столкнетесь с двумя файлами с одинаковым хешем MD5, но это маловероятно (если ваши файлы имеют приличный размер). Таким образом, добавление количества фрагментов в ваш хэш может помочь вам уменьшить его, поскольку теперь вам нужно найти два файла одинакового размера с одинаковым MD5.
# This is the algorithm you described, but also returns the number of chunks.
new_file_hash, nchunks = hash_for_tile(new_file)
store_file(new_file, nchunks, hash)
def store_file(file, nchunks, hash):
"" Tells you whether there is another file with the same contents already, by
making a table lookup ""
# This can be a DB lookup or some way to obtain your hash map
big_table = ObtainTable()
# Two level lookup table might help performance
# Will vary on the number of entries and nature of big_table
if nchunks in big_table:
if hash in big_table[hash]:
raise DuplicateFileException,\
'File is dup with %s' big_table[nchunks][lookup_hash]
else:
big_table[nchunks] = {}
big_table[nchunks].update({
hash: file.filename
})
file.save() # or something
Чтобы уменьшить эту возможность, переключитесь на SHA1 и используйте тот же метод. Или даже используйте оба (объединение), если производительность не является проблемой.
Конечно, имейте в виду, что это будет работать только с дублирующимися файлами на двоичном уровне, но не с изображениями, звуками и видео, которые «одинаковы», но имеют разные подписи.