Я работаю над проектом, который включает вычисление хэшей для файлов. Проект похож на службу резервного копирования файлов, поэтому, когда файл загружается с клиента на сервер, мне нужно проверить, доступен ли этот файл на сервере. Я генерирую хеш CRC-32 для файла и затем отправляю хеш на сервер, чтобы проверить, доступен ли он уже.
Если файл не на сервере, я использовал, чтобы отправить файл как 512 КБ чанков [для дедупликации], и мне нужно вычислять хэш для этого каждого 512 КБ чанка. Размеры файлов могут иногда составлять несколько ГБ, и к серверу будет подключаться несколько клиентов. Поэтому мне действительно нужен алгоритм Fast и LightWeight Hashing для файлов. Есть идеи ..?
П.С .: Я уже заметил некоторые вопросы по алгоритму хеширования в StackOverflow, но ответ не совсем в сравнении алгоритмов хеширования, необходимых именно для этого типа задач. Бьюсь об заклад, это будет очень полезно для группы людей.
На самом деле, у CRC32 нет ни лучшей скорости, ни лучшего распределения.
Этого и следовало ожидать: CRC32 довольно старый по сегодняшнему стандарту и создан в эпоху, когда процессор не имел ширины 32/64 бита или OoO-Ex, также свойства распределения были менее важны, чем обнаружение ошибок. Все эти требования изменились с тех пор.
Чтобы оценить скорость и свойства распределения алгоритмов хеширования, Остин Эпплби создал превосходный SMHasher пакет.
Краткое резюме результатов представлен здесь.
Я бы посоветовал выбрать алгоритм с Q.Score 10 (идеальное распределение).
Вы говорите, что используете CRC-32, но хотите более быстрый хеш.
CRC-32 очень простой и довольно быстрый.
Я думаю, что время ввода-вывода будет намного больше, чем время хеширования.
Вы также хотите хеш, который не будет иметь коллизий.
То есть два разных файла или 512 КБ порций получают одинаковое хеш-значение.
Вы можете посмотреть на любой из криптографических хэшей, таких как MD5 (не используйте для защищенных приложений)
или SHA1.
Если вы используете только CRC-32 для проверки того, является ли файл дубликатом, вы получите ложные дубликаты, потому что разные файлы могут иметь один и тот же crc-32. Вам лучше использовать sha-1, crc-32 и md5 слишком слабые.