Teilstrings abgleichen...
hallo
folgendes problem: ich habe ein programm das strings ver und entschlüsselt. beim entschlüsseln (brute force) wird das aktuelle ergebnis der entschlüsslung mit einer wordlist (TStringlist) abgeglichen. diese funktion sieht im moment so aus:
Delphi-Quellcode:
for l := 1 to length(s) do //string entschlüsseln (i ist der key der getestet wird)
begin s[l] := char(i Xor ord(s[l])); end; for d := 0 to w.count-1 do //Abgleich mit der Wordlist begin if s = w.Strings[d] then begin g := true; end; if g = true then //wenn erfolgreich -> break begin break; end; end; das problem ist wenn das entschlüsselte wort (variable: s) zum beispiel "teste" lautet, was nicht in der wordlist vorkommt, war der entschlüsslungsvorgang nicht erfolgreich ! ich möchte aber, dass er dann nachschaut welcher teilstring im wort teste bzw in welchem wort aus der wordlist das entschlüsselte wort drin steckt. Beispiel: entschlüsseltes wort "teste" -> gibts nicht in der stringlist -> misserfolg -> aber es gibt das wort "test" in der stringlist -> teilstring gefunden "test" also irgendwie if s = w.Strings[d] then umschreiben für teilstrings. habt ihr ne idee ? grüße g1o |
Re: Teilstrings abgleichen...
Ich würde das Problem andersrum Lösen: Nicht die Liste nach dem Suchstring, sondern den Suchstring nach der Liste (Pos()).
|
Re: Teilstrings abgleichen...
Bei deinem Probleme kann ich auch nur Pos sagen aber den Quelltext kann man kürzer schreiben
Delphi-Quellcode:
Diese Boolean Variable und die 2 If abfrage ist absolut überflüssigfor l := 1 to length(s) do //string entschlüsseln (i ist der key der getestet wird) begin s[l] := char(i Xor ord(s[l])); end; for d := 0 to w.count-1 do //Abgleich mit der Wordlist begin if s = w.Strings[d] then begin break; end; end; Thorben |
Re: Teilstrings abgleichen...
Man kann die for-Schleife noch los werden, und das andere Problem evtl. wie folgt lösen:
Delphi-Quellcode:
Durch das downto erreichen wir, dass die längsten Teilstrings zu erst gefunden werden. Length(s)-1, weil wir nach dem kompletten String ja bereits gesucht haben.
for l := 1 to length(s) do //string entschlüsseln (i ist der key der getestet wird)
s[l] := char(i Xor ord(s[l])); if w.Strings.IndexOf(s) > 0 then begin //was halt bei einem Fund gemacht werden soll end else for i := length(s)-1 downto 1 do begin t := Copy(s, 1, i); if w.Strings.IndexOf(t) > 0 then begin //was bei einem Teilfund gemacht werden soll end; end; |
Re: Teilstrings abgleichen...
Zitat:
|
Re: Teilstrings abgleichen...
t : string;
Und zum .IndexOf: Normalerweise nichts. Allerdings muss w.Strings (omho) eine TStringList sein ... |
Re: Teilstrings abgleichen...
also ich hab jetzt folgendes:
Delphi-Quellcode:
also ohne w.strings.indexof() ist das was anderes ? also es funktioniert. allerdings braucht er pro versucht bei einer wörterliste von 16k worten ca 0,7-1,2 sekunden....gibts auch was effektiveres ?
if w.IndexOf(s) > 0 then
begin g := true; end else for j := length(s)-1 downto 1 do begin t := Copy(s, 1, j); if w.IndexOf(t) > 0 then begin h := true; end; end; |
Re: Teilstrings abgleichen...
Habs en bisschen kürzen können, aber ob der nun schneller is...
Delphi-Quellcode:
Ich weiß, die Audits werden mich für meinen Begin-End-Mangel hassen...
g := (w.IndexOf(s) > 0);
if not g then for j := length(s)-1 downto 1 do h := (w.IndexOf(Copy(s, 1, j)) > 0); |
Re: Teilstrings abgleichen...
Hab mal gemessen. Bei ner 8kb Wortlist (gebs zu ist nicht soviel...) benötigt meiner 6% der Zeit des anderen. Hoffe das is allgemeingültig.
|
Re: Teilstrings abgleichen...
die rechendauer ist mit zu lang, ich machs umgekehrt:
prüfe ob das wort an stelle "m" der wortliste in t (=dem entschlüsselten wort s) enthalten ist.
Delphi-Quellcode:
aber irgendwie ist da noch ein denkfehler, oder ?
if w.IndexOf(s) > 0 then
begin g := true; end else begin t := TStringList.create; t.Add(s); for m := 0 to w.Count - 1 do begin if t.IndexOf(w[m]) >= 0 then begin h := true; end; end; end; ist t = s ? oder funktioniert dieses prinzip grundsätzlich nicht ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz