DictionaryMerger — современное высокопроизводительное WPF-приложение для объединения, очистки и фильтрации огромных словарей паролей (до терабайта и более), с акцентом на удобство, гибкость и расширяемость.
- Объединение любых текстовых словарей (одна строка — один пароль)
- Удаление дубликатов (гарантированная уникальность)
- Работа с файлами любого размера (внешняя сортировка, потоковая обработка)
- Пауза, продолжение, отмена процесса
- Прогресс-бар, ETA, лог
- Drag&Drop, сохранение/загрузка списка файлов
- Гибкие фильтры (длина, регулярное выражение)
- Автоматический и ручной размер чанка (адаптация под RAM)
- Многоязычный интерфейс (локализация на XML, смена языка на лету)
- Сохранение всех настроек (двусторонняя синхронизация UI <-> AppSettings)
- Системные и пользовательские звуки (повтор, задержка, отключение)
- Сохранение и загрузка тем оформления (JSON, мгновенное применение, обмен темами)
- Память последней директории для всех диалогов
- Диалог завершения с локализованным текстом и воспроизведением звука
- Современный UX: все изменения применяются на лету, поддержка Visual Studio Designer
/DictionaryMerger
├── MainWindow.xaml, .cs # Главное окно (UI)
├── UI/ # Компоненты интерфейса (MainTab, SettingsTab)
├── Core/ # Бизнес-логика, сервисы
│ ├── DictionaryMergerEngine.cs # Координатор объединения и сортировки
│ ├── InMemoryMerger.cs # Быстрый in-memory алгоритм
│ ├── ExternalSortEngine.cs # Внешняя сортировка для огромных файлов
│ ├── ChunkSorter.cs # Сортировка и запись чанка на диск
│ ├── ChunkMerger.cs # Слияние отсортированных чанков
│ ├── AppSettings.cs # Класс настроек пользователя
│ └── LocalizationManager.cs # Загрузка и контроль локализаций
├── Localization/ # Файлы локализации (en.xml, ru.xml, de.xml, fr.xml, es.xml, pt.xml, zh.xml, ja.xml, hi.xml)
├── Docs/README.md, readme.txt # Документация
- Используется для небольших и средних словарей (до ~10-20 ГБ, зависит от RAM).
- Все строки читаются в память, фильтруются, сортируются и сохраняются в выходной файл.
- Максимальная скорость, минимальное количество временных файлов.
- Критерий выбора: если общий размер файлов <= свободной RAM, используется этот режим.
- Для огромных файлов, не помещающихся в память.
- Механика:
- Chunking: исходные файлы читаются по частям (чанкам), каждая часть сортируется и сохраняется во временный файл.
- Параллелизм: сортировка чанков и их запись на диск выполняется с ограниченным параллелизмом (обычно N-1 потоков, где N — число ядер).
- Многократное слияние: отсортированные чанки сливаются в один итоговый файл с помощью k-way merge (fan-in обычно 8-32).
- Асинхронный прогресс и лог: все этапы логируются, прогресс рассчитывается по объёму обработанных данных.
- Критерии выбора:
- Если общий размер файлов > свободной RAM, используется внешний режим.
- Можно принудительно выбрать режим через настройки (auto/in-memory/external).
- Параметры:
- chunkSizeMB — размер чанка (по умолчанию 512 МБ, можно изменить)
- maxSortParallelism — число параллельных потоков сортировки (по умолчанию N-1)
- maxMergeFanIn — число чанков, сливаемых за одну фазу (по умолчанию 16)
- Фильтры по длине, регулярному выражению, кастомные фильтры.
- Уникальность обеспечивается на этапе сортировки и слияния (дубликаты удаляются).
- Если включён "Force merge method" — используется выбранный режим.
- Если выключен — auto: in-memory при достаточной RAM, иначе external.
- В логах всегда указывается выбранный режим и параметры.
- Все строки интерфейса, логов, ошибок, предупреждений, MessageBox, тултипов, вкладок, кнопок, лейблов, групп, уведомлений и бизнес-логики переводимы.
- Локализация хранится в XML-файлах (Localization/en.xml, ru.xml, de.xml, fr.xml, es.xml, pt.xml, zh.xml, ja.xml, hi.xml).
- При первом запуске язык по умолчанию — английский.
- После смены языка он сохраняется и применяется после перезапуска.
- Для добавления языка — скопируйте en.xml, переведите, поместите в папку Localization.
- Для удаления языка — удалите xml-файл (кроме ru/en).
- Все изменения языка и локализации применяются на лету.
var merger = new InMemoryMerger();
int count = await merger.MergeAsync(
new List<string> { "input1.txt", "input2.txt" },
"output.txt",
CancellationToken.None,
line => line.Length >= 8, // фильтр
Encoding.UTF8
);
var engine = new ExternalSortEngine(
maxSortParallelism: Math.Max(1, Environment.ProcessorCount - 1),
maxMergeFanIn: 16,
encoding: Encoding.UTF8,
log: Console.WriteLine,
progress: p => Console.WriteLine($"Progress: {p}%"),
filter: line => true,
chunkSizeMB: 512,
token: CancellationToken.None
);
await engine.SortAndMergeAsync(
new List<string> { "big1.txt", "big2.txt" },
"output.txt"
);
- Запуск программы
- Откройте exe-файл из папки релиза или запустите через Visual Studio.
- Добавление файлов
- Нажмите "Добавить" и выберите один или несколько текстовых файлов.
- Можно перетащить файлы мышкой в список.
- Настройка фильтров и параметров
- Перейдите на вкладку "Настройки".
- Установите минимальную/максимальную длину, регулярное выражение, кодировку, язык, тему, параметры звука и др.
- Все изменения сохраняются автоматически.
- Объединение и очистка
- Вернитесь на главную вкладку.
- Нажмите "Объединить" — начнётся процесс, появится прогресс-бар и лог.
- Можно поставить на паузу, продолжить или отменить.
- Завершение
- После завершения появится панель с итогом, временем, кнопками "Открыть папку" и "Закрыть".
- Пока панель открыта — воспроизводится выбранный сигнал.
- Работа с локализациями
- Для смены языка — выберите нужный в настройках.
- Для добавления языка — скопируйте xml-файл, переведите, поместите в папку Localization.
- Для удаления языка — удалите xml-файл (кроме ru/en).
- Работа с темами оформления
- Настройте цвета и шрифт на вкладке "Настройки".
- Можно сохранять и загружать темы (JSON-файлы).
- Сохранение и загрузка списка файлов
- Используйте кнопки "Сохранить список" и "Загрузить список" для работы с файлами .lst.
Q: Как выбрать режим сортировки? A: В настройках можно включить "Force merge method" и выбрать auto/in-memory/external. По умолчанию auto.
Q: Как добавить новый язык? A: Скопируйте en.xml, переведите, поместите в папку Localization.
Q: Как работает фильтрация? A: Можно задать минимальную/максимальную длину, регулярное выражение, отключить фильтрацию длины.
Q: Как работает внешний режим? A: Файлы разбиваются на чанки, каждый сортируется и сохраняется на диск, затем чанки сливаются в один файл. Все этапы логируются.
Q: Какой язык будет при первом запуске? A: Английский. После смены язык сохраняется между сессиями.
- Проект открыт для предложений и pull request.
- Лицензия: MIT.
- Для багрепортов и предложений — создайте issue на GitHub.
DictionaryMerger — ваш инструмент для работы с огромными словарями!