Существует ряд программ, которые сравнивают набор файлов в целом, чтобы найти идентичные. FDUPES хороший: Ссылка . Миллион файлов не должен быть проблемой, в зависимости от точного характера ввода. Я думаю, что FDUPES требует Linux, но есть и другие подобные программы для других платформ.
Я пытался написать более быструю программу, но за исключением особых случаев, FDUPES был быстрее.
В любом случае, общая идея - начать с проверки размеров файлов. Файлы разных размеров не могут быть одинаковыми, поэтому вам нужно только посмотреть на группы файлов одинакового размера. Тогда это становится более сложным, если вам нужна оптимальная производительность: если файлы могут отличаться, вы должны сравнивать небольшие части файлов в надежде на раннее обнаружение различий, чтобы вам не приходилось читать остальные. Однако если файлы, вероятно, будут идентичными, то будет проще прочитать каждый файл для вычисления контрольной суммы, потому что тогда вы можете читать последовательно с диска вместо того, чтобы перемещаться между двумя или более файлами. (Это предполагает нормальные диски, поэтому SSD: s могут отличаться.)
В моих тестах, когда я пытался сделать более быструю программу, оказалось, что (к моему удивлению) быстрее было сначала прочитать каждый файл для вычисления контрольной суммы, а затем, если контрольные суммы были равны, сравнить файлы напрямую, прочитав блоки поочередно из каждого файла, чем просто читать блоки поочередно без предыдущих вычислений контрольной суммы! Оказалось, что при вычислении контрольных сумм Linux кэшировал оба файла в оперативной памяти, последовательно читая каждый файл, и второе чтение было тогда очень быстрым. При запуске с чередующимися чтениями файлы (физически) не читались последовательно.
EDIT:
Некоторые люди выражали удивление и даже сомнение, что чтение файлов может быть быстрее, чем чтение только один раз. Возможно, мне не удалось объяснить очень четко, что я делал. Я имею в виду предварительную загрузку кеша, чтобы файлы были в кеше диска при последующем доступе к ним так, как это было бы медленно на физическом диске. Здесь - это веб-страница, на которой я пытался объяснить более подробно, с изображениями, кодом C и измерениями.
Однако это имеет (в лучшем случае) незначительное отношение к первоначальному вопросу.