Неа. Вам нужно сравнить все файлы. Собственно, надо сравнивать содержимое каждого нового файла со всеми уже увиденными файлами. Вы можете аппроксимировать это контрольной суммой или хэш-функцией, но если вы найдете новый файл, уже указанный в вашем индексе, тогда вам нужно будет выполнить полное сравнение, чтобы быть уверенным, поскольку хэши и контрольные суммы могут иметь коллизии.
Итак, все сводится к тому, как более эффективно хранить файл.
Я бы рекомендовал оставить его для профессионального программного обеспечения, такого как berkleydb или memcached или voldemort или тому подобное.
Если вам нужно свернуть свои собственные, вы можете взглянуть на принципы бинарного поиска ( qsort , bsearch и т. Д.).
Если вы ведете список просмотренных контрольных сумм (и путь к полному файлу для той двойной проверки, о которой я упоминал выше) в отсортированном виде, вы можете искать его с помощью бинарного поиска. Однако стоимость вставки каждого нового элемента в правильном порядке становится все более дорогой.
Одним из способов уменьшения количества хэшей является сортировка ваших хэшей, например иметь 256 бинов, соответствующих первому байту хэша. Очевидно, вам нужно только искать и вставлять в список хешей, которые начинаются с этого байт-кода, и вы пропускаете первый байт из хранилища.
Если вы управляете сотнями миллионов хэшей (в каждом бине), то вы можете рассмотреть двухфазную сортировку, такую, что у вас есть основной список для каждого хэша, а затем «недавний» список; как только недавний список достигает некоторого порога, скажем, 100000 элементов, вы выполняете слияние с основным списком (O (n)) и сбрасываете недавний список.