Я полагаю, что вы можете заархивировать наиболее значительное улучшение производительности, просто проверив размер файла. Если размер файла не совпадает, вы можете пропустить весь файл и даже не открывать его.
Вместо того, чтобы просто сохранять список известных хэшей, вы также должны хранить список известных размеров файлов и выполнять сравнение содержимого только при совпадении размеров файлов. Если размер файла не совпадает, вы можете не смотреть на содержимое файла.
В зависимости от общего размера, который обычно имеют ваши файлы, может потребоваться дальнейшее улучшение:
Либо выполняйте двоичное сравнение с ранним прерыванием, когда первый байт отличается (экономит чтение всего файла, что может быть очень значительным улучшением, если ваши файлы обычно имеют большой размер, любой алгоритм хеширования будет читать весь файл. то, что первый байт отличается, спасает вас от прочтения остальной части файла). Если ваш список файлов поиска, вероятно, содержит много файлов одинакового размера, поэтому вам, скорее всего, придется выполнить двоичное сравнение с несколькими файлами, вместо этого рассмотрите:
хэширование в блоках по 1 МБ каждый. Сначала проверяйте первый блок только по предварительно вычисленному хешу 1-го блока в вашем поиске. Сравнивайте только 2-й блок, если 1-й блок одинаков, в большинстве случаев сохраняет чтение за 1-м блоком для разных файлов. Обе эти опции действительно стоят усилий, когда ваши файлы большие.
Я сомневаюсь, что изменение самого алгоритма хеширования (например, первая проверка с использованием CRC, как предложено) имело бы какое-либо существенное значение. Ваше узкое место, скорее всего, связано с дисковым вводом-выводом, а не с процессором, поэтому избежание дискового ввода-вывода принесет вам наибольшее улучшение. Но, как всегда в исполнении, do measure.
Затем, если этого все еще недостаточно (и только тогда), поэкспериментируйте с асинхронным вводом-выводом (помните, что последовательные операции чтения, как правило, выполняются быстрее, чем произвольный доступ, поэтому слишком большое количество случайных асинхронных операций чтения может снизить производительность)