Eliminate functionally redundant Hashcat rules using signature-based deduplication. SQLite-backed storage, parallel workers, multibyte mode, and a built-in 50-word probe set — no wordlist required.
Two rules are functionally equivalent if they produce identical output on every possible input word. This tool checks a carefully chosen probe set (50 words) covering short/long words up to length 36, mixed-case, digits, specials, full printable-ASCII coverage, and repeated chars — plus an optional 11-word multibyte set for non-ASCII wordlists.
Rules producing the same transformed strings for all probes are indistinguishable in a real attack. The rule appearing earlier in the file is kept and the later one is discarded, preserving the original frequency/priority ranking. Signature storage uses a temporary SQLite database so the signature map never occupies Python heap memory regardless of ruleset size.
c (capitalize) and chain l c on already-lowercase inputs produce identical output → same signature → only the first occurrence survives.
--multibyte: process words as UTF-8 bytes and activate 11 additional non-ASCII probes (Polish, German, French, Russian, CJK). Rules that split a multibyte code-point are flagged as invalid-UTF-8 rather than silently mis-decoded, so they still get a unique signature instead of falsely colliding.--workers N distributes signature computation across CPU cores via ProcessPoolExecutor. --workers 0 auto-detects core count. Deduplication INSERTs always run on the main process (SQLite isn't fork-safe).\r percentage output if tqdm isn't installed), plus counters: rules loaded, kept, removed, and % reduction.--debug logs every keep/drop decision. --debug-rule "RULE" traces a single rule against all probes and exits. --debug-file FILE bulk-traces every rule in a file (e.g. from comm/diff output) and exits.These words are always used — no wordlist needed. They exercise every important Hashcat rule category, including long words (up to length 36) so position args A–Z are distinguishable, and full 95-char printable-ASCII coverage so purge/substitute ops on rare characters aren't falsely collapsed into no-ops. Use --multibyte to additionally activate 11 non-ASCII words.
Category 1 — ASCII (50 words, always active):
Category 2 — Multibyte UTF-8 (11 words, active with --multibyte):
Use --list-probes (or --list-probes --multibyte) to see the full list with byte counts and UTF-8 encodings.
--extra-probes + sampled words from --probe-file (deduplicated). With --multibyte, 11 additional UTF-8 words are added.\xNN hex-escape arguments) applies every rule atom to each probe word. Rules with an unsupported opcode get a signature unique to that rule text, so two different unsupported rules are never falsely treated as duplicates of each other.("Abc", "Def", ...). In multibyte mode, invalid UTF-8 byte sequences are wrapped in an InvalidUTF8Bytes object (compared/hashed by raw bytes) rather than silently decoded, so each such rule still keeps a distinct signature.INSERT OR IGNORE (batched commits, WAL journaling). The rule appearing first in the file wins. The temp DB is deleted unconditionally on completion (including on error).Minimizer is open source and hosted on GitHub. MIT licensed.
View minimizer on GitHub