I. Forståelse af kilden og virkningen af gentagne data
Først skal vi forstå, hvorfor der er så meget gentaget indhold. Under opbygningen af ordbogen indsamles data muligvis fra flere kilder, som i sig selv har en vis overlapning. For eksempel kan nogle grundlæggende ord eller simple kodekombinationer findes i flere kilder, når der indsamles data fra forskellige ordlister, almindelige kodeordssæt, forskellige lister over tegnekombinationer osv.
Dette gentagne indhold har mange ulemper. Ud fra et lagerperspektiv er 2 TB allerede en stor mængde, og hvis der er meget gentaget indhold, spildes værdifuld lagerplads. Når ordbogen bruges til kodeknusning eller andre handlinger, fører det gentagne indhold til unødvendige søgninger og sammenligninger. For eksempel, hvis algoritmen under kodeknusning skal sammenligne hvert enkelt ord i ordbogen med målkoden, vil gentaget indhold øge antallet af sammenligninger og dermed bremse hele knusningsprocessen.
II. Filtreringsmetoder baseret på tekstbehandlingsværktøjer
Ved hjælp af værktøjer under Windows
- Brug af PowerShell
- I Windows giver PowerShell mange funktioner til tekstbehandling. Vi kan bruge følgende PowerShell-script til at fjerne gentagne linjer:
```powershell
$lines = Get - Content " dictionary.txt"
$uniqueLines = @()
foreach ($line in $lines) {
if ($uniqueLines - notcontains $line) {
$uniqueLines += $line
}
}
$uniqueLines | Sæt - Indhold "unique_dictionary.txt"
```
Dette script læser først alle linjer i "dictionary.txt" til en array "$lines". Derefter gennemgår det hver linje i en løkke, og hvis en linje ikke er i den nye array "$uniqueLines", tilføjes den til den nye array. Til sidst gemmes indholdet af den nye array i "unique_dictionary.txt".
Divide-and-conquer-algoritme
- Da vores dictionary-fil er meget stor (2T), kan det være problematisk at håndtere den direkte, f.eks. på grund af utilstrækkelig hukommelse. Divide-and-conquer-algoritmen er en god måde at løse dette problem på. Vi kan dele den store fil op i flere mindre underfiler, f.eks. efter antallet af linjer eller filstørrelse.
- Derefter filtreres hver underfiltr for dubletter. De behandlede underfiler samles igen til en fil. Under samlingen skal vi også kontrollere, om der er dubletter, da der kan være identiske indhold i forskellige underfiler.
IV. Verificering af filtreringsresultatet
Efter filtreringen skal vi verificere, om resultatet er korrekt. Vi kan bruge enkle metoder, f.eks. at vælge nogle linjer tilfældigt og tjekke, hvor mange gange de forekommer i den oprindelige og filtrerede fil. Hvis de forekommer flere gange i den oprindelige fil, men kun én gang i den filtrerede fil, betyder det, at filtreringen har været effektiv.
Vi kan også sammenligne størrelsen af den oprindelige og filtrerede fil. Hvis den filtrerede fil er meget mindre end den oprindelige, og den fungerer normalt i efterfølgende tests (f.eks. ved at bruge denne dictionary-fil til en simpel adgangskode-søgning for at se, om alle adgangskoder er medtaget), betyder det, at filtreringen har været effektiv.
Vores server har 512 GB hukommelse og SSD-harddiske, og det tog os to uger at behandle det hele. Vi har også udviklet et effektivt script til automatisk behandling!
At filtrere dubletter i en 2 TB stor tekst-dictionary-fil er en udfordrende, men nødvendig opgave. Ved at vælge de rigtige værktøjer og algoritmer kan vi effektivt fjerne dubletter og forbedre kvaliteten og brugbarheden af vores dictionary-fil, hvilket er vigtigt både i forbindelse med adgangskodeknusning og andre applikationer, der bruger denne dictionary-fil.