Re: Abbruch bei rekursivem Abstieg

02/01/2009 - 02:21 von Markus Steidle | Report spam
Hallo Peter
(hab diese Nachricht 2 Mal gepostet, weil die erste am Server nicht mehr
zur Verfügung stand. (sagt mein Outlook Express) ????)


ich bekomme dein Programm nicht fehlerfrei zum Laufen. Bitte setze Option
Strict On, beseitige die Fehler und poste das konkrete Problem nochmals.
Wie



Hab ich gemacht
Code ist unten



Wie soll die Rekursion denn beendet werden, wenn die CPU permanent
beschàftigt ist?


Hàndisch - mir wàre am liebsten mit einem Button


Um die Rekursion sauber zu beenden, kann man die Routine mit einem
Rückkehrcode ausstatten, der für die Beendigung genutzt werden kann. Oder
das Abbruchkriterium wird in jeder Rekursionsebene abgeprüft.


Wie krieg ich das mit einem Button hin?

Danke für deine Hilfe

Der Code:

global definiert:
Dim Kodierung() As Char = {"T"c, "A"c, "E"c, "1"c, "Z"c, "N"c, "S"c, "3"c,
"H"c, "Q"c, "X"c, "G"c, _
"7"c, "Y"c, "B"c, "U"c, "9"c, "2"c, "P"c, "K"c, "L"c, "4"c, "M"c, "6"c, _
"J"c, "F"c, "C"c, "V"c, "5"c, "R"c, "W"c, "D"c}
Private anzahl As Double = 0

meine Funktion:
'-Start Code
Private Sub Kombination(ByVal k As String, ByVal deep As Integer)
Dim s As String = ""
System.Windows.Forms.Application.DoEvents()
If deep = 0 Then
'TextBox1.Text = TextBox1.Text + k + vbNewLine
Label1.Text = k
anzahl = anzahl + 1
Label2.Text = anzahl.ToString
'-für die rekursion nicht notwendig
'- zeigt nur an für welche kombination ein Kriterium erfüllt ist
'If Prüfung(k) Then
'TextBox1.Text = TextBox1.Text + k + vbTab + anzahl.ToString + vbTab + "
gültig" + vbNewLine
'TextBox1.Refresh()
'End If
'-für die rekursion nicht notwendig ENDE
Label1.Refresh()
Label2.Refresh()
'Me.Refresh()
Return
End If
For x As Integer = 0 To 31
Kombination(k + Kodierung(x), deep - 1)
Next

Return
End Sub
'-END Code


LG
Markus
 

Lesen sie die antworten

#1 Karsten Sosna
02/01/2009 - 08:50 | Warnen spam
Hallo Markus,
sieht mir stark nach einem Passwortknacker ala BruteForce aus. ;=)

Dim Kodierung() As Char = {"T"c, "A"c, "E"c, "1"c, "Z"c, "N"c, "S"c, "3"c,
"H"c, "Q"c, "X"c, "G"c, _
"7"c, "Y"c, "B"c, "U"c, "9"c, "2"c, "P"c, "K"c, "L"c, "4"c, "M"c, "6"c, _
"J"c, "F"c, "C"c, "V"c, "5"c, "R"c, "W"c, "D"c}
Private anzahl As Double = 0

meine Funktion:
'-Start Code
Private Sub Kombination(ByVal k As String, ByVal deep As Integer)
Dim s As String = ""
System.Windows.Forms.Application.DoEvents()
If deep = 0 Then
'TextBox1.Text = TextBox1.Text + k + vbNewLine
Label1.Text = k
anzahl = anzahl + 1
Label2.Text = anzahl.ToString
'-für die rekursion nicht notwendig
'- zeigt nur an für welche kombination ein Kriterium erfüllt ist
'If Prüfung(k) Then
'TextBox1.Text = TextBox1.Text + k + vbTab + anzahl.ToString + vbTab + "
gültig" + vbNewLine
'TextBox1.Refresh()
'End If
'-für die rekursion nicht notwendig ENDE
Label1.Refresh()
Label2.Refresh()
'Me.Refresh()
Return
End If
For x As Integer = 0 To 31
Kombination(k + Kodierung(x), deep - 1)
Next

Return
End Sub
'-END Code



Array 32 Zeichen lang. Anzahl der Möglichkeiten in Abhàngikeit der
geforderteten Tiefe.
Zeichen Möglichkeiten
1 32
2 1.024
3 32.768
4 1.048.576
5 33.554.432
6 1.073.741.824
..
26 ca. 1.390.000.000.000.000.000.000.000.000.000.000.000
Noch Fragen? Selbst bei 6 Zeichen lànge sind das schon über 1Milliarde
Aufrufe und die dazu gehörigen Anweisungen. Bedenke das bei jedem Auruf eine
Kopie des Strings übergeben wird. Umso mehr Aufrufe umso lànger dauert jeder
Aufruf. Ich schàtze mal bei 6 wird es dann schon sehr lange(Minutenbereich)
dauern. Bei 7 wird Deine Zàhlervariable(insofern sie Integer ist) schon
einen Überlauf erzeugen. Integer geht nur bis ca. 2Milliarden, 7 Stellen
wàren aber ca. 32Milliarden Aufrufe.
Tja, wenn das Knacken von Passwörtern so einfach wàre, könnten wir uns die
Sache mit Passwörtern sparen. ;=)
Gruß Scotty

Ähnliche fragen