
Удаление дубликатов из ОГРОМНОГО списка слов без его сортировки (для перебора паролей на основе словарей)
В настоящее время создание списков паролей обычно подразумевает объединение нескольких источников данных.
В идеале наиболее вероятные пароли должны находиться в начале списка, чтобы самые распространенные пароли взламывались мгновенно.
С существующими инструментами дедупликации вы вынуждены выбирать между сохранением порядка ИЛИ обработкой массивных списков.
К сожалению, создание списка требует и того, и другого
Поэтому я написал duplicut на высокооптимизированном C для решения этой очень специфической задачи 🤓 💻
git clone https://github.com/nil0x42/duplicut # download ...
cd duplicut/ && make # compile ...
./duplicut wordlist.txt -o clean-wordlist.txt # dedupe !!!
-o, --outfile <FILE> Записать результат в <FILE>
-t, --threads <NUM> Максимум потоков (по умолчанию макс.)
-m, --memlimit <VALUE> Ограничить максимальную используемую память (по умолчанию макс.)
-l, --line-max-size <NUM> Максимальный размер строки (по умолчанию 1024, макс. 4095)
-p, --printable Фильтровать строки только с печатными ASCII символами
-c, --lowercase Преобразовать список в нижний регистр
-C, --uppercase Преобразовать список в верхний регистр
-D, --dupfile <FILE> Записать дубликаты в <FILE> (замедляет duplicut)
-h, --help Показать эту справку и выйти
-v, --version Вывести информацию о версии и выйти
Возможности:
--line-max-size)--printable)--dupfile)--lowercase или --uppercaseРеализация:
Ограничения:
--line-max-size не может превышать 4095uint64 достаточно для индексации строк в хеш-таблице, путем упаковки
информации о размере в дополнительные биты указателя:

Если весь файл не помещается в память, он разбивается на
виртуальных фрагментов таким образом, что каждый фрагмент использует максимально возможный объем ОЗУ.
Каждый фрагмент затем загружается в хеш-таблицу, дедуплицируется и проверяется на совпадение с последующими фрагментами.
Таким образом, время выполнения снижается максимум до го треугольного числа:

Если вы нашли ошибку или что-то работает не так, как ожидалось, пожалуйста, скомпилируйте duplicut в режиме отладки и создайте issue с приложенным выводом:
# уровень отладки может быть от 1 до 4
make debug level=1
./duplicut [ОПЦИИ] 2>&1 | tee /tmp/duplicut-debug.log