Ayuda en fuerza bruta

Iniciado por under!!!, 2 Agosto 2007, 02:01 AM

0 Miembros y 1 Visitante están viendo este tema.

under!!!

De entrada gracias por leer esto. Mi pregunta es la siguiente.
Hice un programa que genera todas las combinaciones posibles con "2" "3" "4" "5" "6"  y "7" caracteres el problema es que tarda demasiado alguien sabe como acelerar el proceso. este es el codigo.
Necesita 11 LABEL
Un listbox
Un timer con intervalo de 100 (inicia enabled "false")
Y tres botones
Código (vb) [Seleccionar]

Public mil As Integer
Public seg As Integer
Public min As Integer
Public hor As Integer
Public cont As Long
Public detener As Boolean
Private Sub Command1_Click()
'Programa que genera todas las combinaciones posibles con "2","3","4","5","6", y "7"
'caracteres el metodo es un poco tardado pero solo asi he logrado generarlo
'Si deseas que se formen combinaciones con mas de "7" caracteres solo sigue la misma
'estructura
'Creado por Sergio Uziel Tovar Lemus
Timer1.Enabled = True
Label5.Caption = "Procesando"
Command2.Enabled = False
Command3.Enabled = True
detener = False
cont = 0
'Comienza a generar combinaciones con dos caracteres
For chr_uno = Asc("a") To Asc("z")
    For chr_dos = Asc("a") To Asc("z")
    List1.AddItem Chr(chr_uno) & Chr(chr_dos) & Chr(chr_tres) & Chr(chr_cuatro) & Chr(chr_cinco) & Chr(chr_seis) & Chr(chr_siete)
    cont = cont + 1
    Label2.Caption = cont
       If detener = True Then
          Command2.Enabled = True
          Command3.Enabled = False
          MsgBox "El proceso ha sido detenido por el usuario." & vbCrLf & vbCrLf & "Resultados obtenidos." & vbCrLf & vbCrLf & "Numeros de combinaciones: " & cont & vbCrLf & vbCrLf & "Tiempo transcurrido" & vbCrLf & Label6.Caption & vbCrLf & Label7.Caption & vbCrLf & Label8.Caption & vbCrLf & Label9.Caption & vbCrLf & vbCrLf & "Porcentaje del proceso: " & ProgressBar1.Value & "% de un 100% posible", vbInformation, "Informacion para el usuario"
          mil = 0
          seg = 0
          min = 0
          hor = 0
          Label6.Caption = "Horas:        " & hor
          Label7.Caption = "Minutos:      " & min
          Label8.Caption = "Segundos:  " & seg
          Label9.Caption = "Milesimas:   " & mil
          List1.Clear
          Label2.Caption = List1.ListCount
          Label5.Caption = "Detenido por el usuario"
          ProgressBar1.Value = 0
          Exit Sub
       End If
    DoEvents
    Next chr_dos
DoEvents
Next chr_uno
ProgressBar1.Value = ProgressBar1.Value + 18.3
'Ahora hace las combinaciones con tres caracteres
For chr_uno = Asc("a") To Asc("z")
    For chr_dos = Asc("a") To Asc("z")
         For chr_tres = Asc("a") To Asc("z")
         List1.AddItem Chr(chr_uno) & Chr(chr_dos) & Chr(chr_tres) & Chr(chr_cuatro) & Chr(chr_cinco) & Chr(chr_seis) & Chr(chr_siete)
         cont = cont + 1
         Label2.Caption = cont
            If detener = True Then
               Command2.Enabled = True
               Command3.Enabled = False
               MsgBox "El proceso ha sido detenido por el usuario." & vbCrLf & vbCrLf & "Resultados obtenidos." & vbCrLf & vbCrLf & "Numeros de combinaciones: " & cont & vbCrLf & vbCrLf & "Tiempo transcurrido" & vbCrLf & Label6.Caption & vbCrLf & Label7.Caption & vbCrLf & Label8.Caption & vbCrLf & Label9.Caption & vbCrLf & vbCrLf & "Porcentaje del proceso: " & ProgressBar1.Value & "% de un 100% posible", vbInformation, "Informacion para el usuario"
               mil = 0
               seg = 0
               min = 0
               hor = 0
               Label6.Caption = "Horas:        " & hor
               Label7.Caption = "Minutos:      " & min
               Label8.Caption = "Segundos:  " & seg
               Label9.Caption = "Milesimas:   " & mil
               List1.Clear
               Label2.Caption = List1.ListCount
               Label5.Caption = "Detenido por el usuario"
               ProgressBar1.Value = 0
               Exit Sub
            End If
         DoEvents
         Next chr_tres
    DoEvents
    Next chr_dos
DoEvents
Next chr_uno
ProgressBar1.Value = ProgressBar1.Value + 18.3
'Ahora hace las combinaciones con cuatro caracteres
For chr_uno = Asc("a") To Asc("z")
    For chr_dos = Asc("a") To Asc("z")
         For chr_tres = Asc("a") To Asc("z")
             For chr_cuatro = Asc("a") To Asc("z")
             List1.AddItem Chr(chr_uno) & Chr(chr_dos) & Chr(chr_tres) & Chr(chr_cuatro) & Chr(chr_cinco) & Chr(chr_seis) & Chr(chr_siete)
             cont = cont + 1
             Label2.Caption = cont
                If detener = True Then
                   Command2.Enabled = True
                   Command3.Enabled = False
                   MsgBox "El proceso ha sido detenido por el usuario." & vbCrLf & vbCrLf & "Resultados obtenidos." & vbCrLf & vbCrLf & "Numeros de combinaciones: " & cont & vbCrLf & vbCrLf & "Tiempo transcurrido" & vbCrLf & Label6.Caption & vbCrLf & Label7.Caption & vbCrLf & Label8.Caption & vbCrLf & Label9.Caption & vbCrLf & vbCrLf & "Porcentaje del proceso: " & ProgressBar1.Value & "% de un 100% posible", vbInformation, "Informacion para el usuario"
                   mil = 0
                   seg = 0
                   min = 0
                   hor = 0
                   Label6.Caption = "Horas:        " & hor
                   Label7.Caption = "Minutos:      " & min
                   Label8.Caption = "Segundos:  " & seg
                   Label9.Caption = "Milesimas:   " & mil
                   List1.Clear
                   Label2.Caption = List1.ListCount
                   Label5.Caption = "Detenido por el usuario"
                   ProgressBar1.Value = 0
                   Exit Sub
                End If
             DoEvents
             Next chr_cuatro
         DoEvents
         Next chr_tres
    Next chr_dos
DoEvents
Next chr_uno
ProgressBar1.Value = ProgressBar1.Value + 18.3
'Ahora comenzamos con cinco caracteres
For chr_uno = Asc("a") To Asc("z")
    For chr_dos = Asc("a") To Asc("z")
         For chr_tres = Asc("a") To Asc("z")
             For chr_cuatro = Asc("a") To Asc("z")
                 For chr_cinco = Asc("a") To Asc("z")
                 List1.AddItem Chr(chr_uno) & Chr(chr_dos) & Chr(chr_tres) & Chr(chr_cuatro) & Chr(chr_cinco) & Chr(chr_seis) & Chr(chr_siete)
                 cont = cont + 1
                 Label2.Caption = cont
                    If detener = True Then
                       Command2.Enabled = True
                       Command3.Enabled = False
                       MsgBox "El proceso ha sido detenido por el usuario." & vbCrLf & vbCrLf & "Resultados obtenidos." & vbCrLf & vbCrLf & "Numeros de combinaciones: " & cont & vbCrLf & vbCrLf & "Tiempo transcurrido" & vbCrLf & Label6.Caption & vbCrLf & Label7.Caption & vbCrLf & Label8.Caption & vbCrLf & Label9.Caption & vbCrLf & vbCrLf & "Porcentaje del proceso: " & ProgressBar1.Value & "% de un 100% posible", vbInformation, "Informacion para el usuario"
                       mil = 0
                       seg = 0
                       min = 0
                       hor = 0
                       Label6.Caption = "Horas:        " & hor
                       Label7.Caption = "Minutos:      " & min
                       Label8.Caption = "Segundos:  " & seg
                       Label9.Caption = "Milesimas:   " & mil
                       List1.Clear
                       Label2.Caption = List1.ListCount
                       Label5.Caption = "Detenido por el usuario"
                       ProgressBar1.Value = 0
                       Exit Sub
                    End If
                 DoEvents
                 Next chr_cinco
             DoEvents
             Next chr_cuatro
         DoEvents
         Next chr_tres
    Next chr_dos
DoEvents
Next chr_uno
ProgressBar1.Value = ProgressBar1.Value + 18.3
'Con seis caracteres
For chr_uno = Asc("a") To Asc("z")
    For chr_dos = Asc("a") To Asc("z")
         For chr_tres = Asc("a") To Asc("z")
             For chr_cuatro = Asc("a") To Asc("z")
                 For chr_cinco = Asc("a") To Asc("z")
                     For chr_seis = Asc("a") To Asc("z")
                     List1.AddItem Chr(chr_uno) & Chr(chr_dos) & Chr(chr_tres) & Chr(chr_cuatro) & Chr(chr_cinco) & Chr(chr_seis) & Chr(chr_siete)
                     cont = cont + 1
                     Label2.Caption = cont
                         If detener = True Then
                            Command2.Enabled = True
                            Command3.Enabled = False
                            MsgBox "El proceso ha sido detenido por el usuario." & vbCrLf & vbCrLf & "Resultados obtenidos." & vbCrLf & vbCrLf & "Numeros de combinaciones: " & cont & vbCrLf & vbCrLf & "Tiempo transcurrido" & vbCrLf & Label6.Caption & vbCrLf & Label7.Caption & vbCrLf & Label8.Caption & vbCrLf & Label9.Caption & vbCrLf & vbCrLf & "Porcentaje del proceso: " & ProgressBar1.Value & "% de un 100% posible", vbInformation, "Informacion para el usuario"
                            mil = 0
                            seg = 0
                            min = 0
                            hor = 0
                            Label6.Caption = "Horas:        " & hor
                            Label7.Caption = "Minutos:      " & min
                            Label8.Caption = "Segundos:  " & seg
                            Label9.Caption = "Milesimas:   " & mil
                            List1.Clear
                            Label2.Caption = List1.ListCount
                            Label5.Caption = "Detenido por el usuario"
                            ProgressBar1.Value = 0
                            Exit Sub
                         End If
                     DoEvents
                     Next chr_seis
                 DoEvents
                 Next chr_cinco
             DoEvents
             Next chr_cuatro
         DoEvents
         Next chr_tres
    Next chr_dos
DoEvents
Next chr_uno
ProgressBar1.Value = ProgressBar1.Value + 18.3
'Finalmente con siete
For chr_uno = Asc("a") To Asc("z")
    For chr_dos = Asc("a") To Asc("z")
         For chr_tres = Asc("a") To Asc("z")
             For chr_cuatro = Asc("a") To Asc("z")
                 For chr_cinco = Asc("a") To Asc("z")
                     For chr_seis = Asc("a") To Asc("z")
                         For chr_siete = Asc("a") To Asc("z")
                         List1.AddItem Chr(chr_uno) & Chr(chr_dos) & Chr(chr_tres) & Chr(chr_cuatro) & Chr(chr_cinco) & Chr(chr_seis) & Chr(chr_siete)
                         cont = cont + 1
                         Label2.Caption = cont
                            If detener = True Then
                               Command2.Enabled = True
                               Command3.Enabled = False
                               MsgBox "El proceso ha sido detenido por el usuario." & vbCrLf & vbCrLf & "Resultados obtenidos." & vbCrLf & vbCrLf & "Numeros de combinaciones: " & cont & vbCrLf & vbCrLf & "Tiempo transcurrido" & vbCrLf & Label6.Caption & vbCrLf & Label7.Caption & vbCrLf & Label8.Caption & vbCrLf & Label9.Caption & vbCrLf & vbCrLf & "Porcentaje del proceso: " & ProgressBar1.Value & "% de un 100% posible", vbInformation, "Informacion para el usuario"
                               mil = 0
                               seg = 0
                               min = 0
                               hor = 0
                               Label6.Caption = "Horas:        " & hor
                               Label7.Caption = "Minutos:      " & min
                               Label8.Caption = "Segundos:  " & seg
                               Label9.Caption = "Milesimas:   " & mil
                               List1.Clear
                               Label2.Caption = List1.ListCount
                               Label5.Caption = "Detenido por el usuario"
                               ProgressBar1.Value = 0
                               Exit Sub
                            End If
                         DoEvents
                         Next chr_siete
                     DoEvents
                     Next chr_seis
                 DoEvents
                 Next chr_cinco
             DoEvents
             Next chr_cuatro
         DoEvents
         Next chr_tres
    Next chr_dos
DoEvents
Next chr_uno
Command2.Enabled = True
ProgressBar1.Value = ProgressBar1.Value + 18.3
Label5.Caption = "Terminado"
Timer1.Enabled = False
mil = 0
seg = 0
min = 0
hor = 0
Label6.Caption = "Horas:        " & hor
Label7.Caption = "Minutos:      " & min
Label8.Caption = "Segundos:  " & seg
Label9.Caption = "Milesimas:   " & mil
MsgBox "El proceso ha terminado satisfactoriamente." & vbCrLf & vbCrLf & "Resultados obtenidos." & vbCrLf & vbCrLf & "Numeros de combinaciones: " & cont & vbCrLf & vbCrLf & "Tiempo transcurrido" & vbCrLf & Label6.Caption & vbCrLf & Label7.Caption & vbCrLf & Label8.Caption & vbCrLf & Label9.Caption & vbCrLf & vbCrLf & "Porcentaje del proceso: " & ProgressBar1.Value & "% de un 100% posible", vbInformation, "Informacion para el usuario"
mil = 0
seg = 0
min = 0
hor = 0
Label6.Caption = "Horas:        " & hor
Label7.Caption = "Minutos:      " & min
Label8.Caption = "Segundos:  " & seg
Label9.Caption = "Milesimas:   " & mil
List1.Clear
Label2.Caption = List1.ListCount
Label5.Caption = "Detenido por el usuario"
ProgressBar1.Value = 0
End Sub

Private Sub Command2_Click()
Label5.Caption = "Limpiando"
List1.Clear
Label2.Caption = List1.ListCount
Label5.Caption = "Detenido"
End Sub

Private Sub Command3_Click()
detener = True
Timer1.Enabled = False
End Sub

Private Sub Command8_Click()

End Sub

Private Sub Command9_Click()

End Sub

Private Sub Form_Load()
Label1.Caption = "combinaciones generadas: "
Label2.Caption = List1.ListCount
Label6.Caption = "Horas:        " & hor
Label7.Caption = "Minutos:      " & min
Label8.Caption = "Segundos:  " & seg
Label9.Caption = "Milesimas:   " & mil
End Sub

Private Sub Timer1_Timer()
mil = mil + 1
Label6.Caption = "Horas:        " & hor
Label7.Caption = "Minutos:      " & min
Label8.Caption = "Segundos:  " & seg
Label9.Caption = "Milesimas:   " & mil
If mil = 10 Then
mil = 0
seg = seg + 1
  If seg = 60 Then
   seg = 0
   min = min + 1
       If min = 60 Then
       min = 0
       hor = hor + 1
       End If
   End If
End If
End Sub

Freeze.

Pues la verdad ni me moleste en revisar el codigo y no quiero ser grocero con eso pero es que no utilizaste las etiquetas code..

Y es muy complicado asi...

Algunos te diran que el VB es muy lento..

Salu2..!!

PD: utiliza las etiquetas y te ayudo...

under!!!

Yo soy nuevo en programacion asi que todo es bienvenido
Me podris decir cuales son las etiquetas code

Freeze.

#3
Es dificil de hacer esto pero ahi va:


[ code]

Private sub form_load ()

[/ code]



PD: Quitale los espacios...

<?BRoWLi?>

Para ser nuevo en programación, menudo source manejas :P
Si TRaTaS D SeR JusTo SoLo Es JuSTo EL CoRaZóN, LoS DeMaS OrGaNoS TRaTaRaN De KiTaRLe La RaZoN - DobleV
Piratas.com.es

Kizar

El código ese me parece una chapuza (no es por desanimar) pero repites el código muchas veces el mismo, haces bucles sucesivos para mismas cosas, el tiempo es mejor sacar la hora del sistema al iniciar y luego ir sacando la hora del sistema y restarla.
Yo no soy un experto en fuerza bruta, pero he visto códigos de 30 lineas que trabajaban con matrices que les pasabas una cadena con caracteres posibles y numero máximo de caracteres resultantes y te lo calculaban todo a velocidades inusuales en vb.
Le pasabas a la función:
X("abcdefghijklmnopqrstuvwxyz1234567890",9)
y lo demás lo hacia ella sola.
No se donde la vi, mañana intento mejorar tu code si tengo tiempo.

ActiveSheet

#6
De Echo es mas correcto usar las etiquetas

[ c o d e = vb ]
Sub ModuleExcel()
MsgBox "Hola mundo", vbCritical, "Perrin"
End Sub
[ / c o d e ]

Las podras encontrar en la lista desplegable donde dice por default GeSHi

Freeze.

Sep tambien perooo...

Al hacer copy & paste se deforma el code..

Es mejor para codes pequeños...

Freeze.

#8
Hola acabo de crear un code con:

1 TextBox
1 Timer

Y 0 Lag...

Genera Numeros tales como:

944228846138855337157339976448264336133311773592774422684614886633815733997725927641377553399572599664482684311883593775522994724886644816834724996644826836118855137155329946248866448168351177559379547744926944228836138155331157352188661374492694488664475422694625757229977242711885927644226843379572299762482664311115835997755927944228846148865331157359461488663381573399772592794422883613885533715721381553249266442168361188551379552299683613885533795722997724926644661481683311873593775422794622886613815833197725927744226846664411683613875533795722997624816633115868461188551371553399572722996624816833117735937755226946228859977542279462273599775492694422884614815533195725997744826844118835422994624886643815833117735937744229846148866338157339977259277442299462488663381583319772592886633115835197755927944229846147259279442299461481886695137755227947249866448168331187359377553279472499664481683311883518897754926946228866138155339957259977448265532794722997624826644116835117755337957226633815833197725927744229846148866338158331177359277442299462488653371573399772592664422884614886633815733997725927644228846148855337957329

En menos de 10 segundos... Claro esa no es la idea pero ustedes me diran...

PD: Espero a tughack por aqui...

Salu2..!!

Kizar

#9
Bue, lo dejo porque aunque lo mejore no sera eficiente.
Yo empezaria por aqui....
Código (vbnet) [Seleccionar]
Dim I As Long, cadena As String, num As Integer, pr() As String
cadena = "abcdefghijklmnopqrstuvwxyz"
num = 3
'combinaciones = len(cadena) ^ num
ReDim pr(Len(cadena))
For I = 1 To Len(cadena)
pr(I) = Mid(cadena, I, 1)
Next I