13. december 2002 - 00:20Der er
6 kommentarer og 1 løsning
Såkaldt Bruteforce algoritme
Hej Jeg fandt engang en algoritme her på eksperten som f.eks. ku bruges til at gætte password... det var vidst nok borrisholt der kom med den i dephi-delen...
Ikke fordi jeg er interesseret i at hacke nogen eller noget ... Men jeg sad og legede med rekursive algoritmer osv :] så hvis der var en af jer der kunne hitti den så :]
// Først opbygger vi et array indeholdende alle de tegn, der kan indgå i // den streng, vi prøver at gætte. char chararray[] = "abcdefghijklmnopqrstuvwxyzæøåABCDE"; // fortsæt selv
// Dernæst laves dette array til en vector<char>. vector<char> characters = new vector<char>(); characters.assign(chararray, &chararray[sizeof(chararray)-1]);
// Hvis næste kodelinie eksisterer, dannes strenge af længden 0, ..., n tegn // Hvis kodelinien udkommenteres, er alle strenge nøjagtig n tegn lange characters.insert('', characters.begin());
string temp = new string(); vector<string> result = new vector<string>();
createstrings(n, temp, result);
return result; }
// Her er rekursionsdelen - det er sq ikke den, der fylder... ;o) void createstrings (int n, string seed, vector<string> result&) {
for (vector<char>::iterator i = characters.begin(); i != characters.end(); i++) { if (n > 1) { createstrings(n-1, seed + i, result); } else { result.insert(seed + i); } } return result; }
Denne funktion kunne laves mere elegant med halerekursion og hvor resultatet returneres fra funktionen, men dette skulle osse klare problemet.
Dette er et resultat af "ottomh programming" - den er ikke testet, men det ka' sq ikke være helt galt...
Det er ikke vector, der er så interessant. Den bruges bare som et "dynamisk array", så du kan fylde mere og mere i den uden at spekulere på, om den "løber over". Vector forøger kapaciteten, når det er nødvendigt.
Linierne
vector<char> characters = new vector<char>(); characters.assign(chararray, &chararray[sizeof(chararray)-1]);
fylder blot dit array af char over i en vector på en smart måde, der ligger som en standard-metode på vector-klassen (templaten). Det er godt at bruge disse templates, da de er gennemprøvede og rimeligt optimerede.
vector<char> betyder blot, at det er en vector, der indeholder char, dvs. hvert element i denne vector er en char. vector er en såkaldt template, og den kan gives en vilkårlig type, så du ikke skal kode en ny vector for hver type, du vil lægge i den...
Linien
characters.insert('', characters.begin());
betyder, at du vha. vectors indbyggede metode insert() indsætter et tomt tegn som det første element i den vector, der hedder characters. characters.begin() returnerer en iterator, der kan bruges til at løbe gennem (iterere) alle dine elementer i din vector. Det sidste element i denne vector peges på af iteratoren characters.end(). Denne iterator benyttes også i for-løkken i createstrings(). Iteratoren i skal her løbe fra begin() til end(). Ret intuitivt, ikke?
Har du problemer med selve rekursionen, eller er det klart? Spørg bare...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.