Для проекта с открытым исходным кодом я пишу слой абстракции поверх файловой системы.
Этот уровень позволяет мне прикреплять метаданные и отношения к каждому файлу.
Я хотел бы, чтобы слой обрабатывал файлы, переименовывая изящно и поддерживая метаданные, если файл переименован/перемещен или скопирован.
Для этого мне понадобится механизм для вычисления идентичности файла. Очевидным решением является вычисление хэша SHA1 для каждого файла, а затем назначение метаданных для этого хеша. Но... это действительно дорого, особенно для фильмов.
Итак, я думал об алгоритме, который, хотя и не на 100% правильный, будет прав подавляющее большинство времени и будет дешевым.
Одним из таких алгоритмов может быть использование размера файла и выборки байтов для этого файла для вычисления хэша.
Какие байты я должен выбрать для образца? Как я могу считать расчет дешевым и достаточно точным? Я понимаю, что здесь есть компромисс, но производительность имеет решающее значение. И пользователь сможет обрабатывать ситуации, когда система делает ошибки.
Мне нужен этот алгоритм для работы с очень большими файлами (1GB + и крошечные файлы 5K)
EDIT
Мне нужен этот алгоритм для работы с NTFS и всеми SMB-ресурсами (linux или windows based), я бы хотел, чтобы он поддерживал ситуации, когда файл копируется из одного места в другое (существуют 2 физических копии, как один идентификатор), Я даже могу подумать о том, чтобы это работало в ситуациях, когда MP3 файлы перемаркированы (физический файл изменен, поэтому у меня может быть поставщик удостоверений на тип файла).
РЕДАКТИРОВАТЬ 2
Связанный вопрос: Алгоритм определения идентичности файлов (Оптимизация)