Avatar billede epimetheus Nybegynder
12. december 2007 - 06:40 Der er 16 kommentarer og
1 løsning

Alle karakter kombinationer.

Jeg har lavet denne kode til at finde alle karakter kombinationer med 5 karakterer.

Sub AlleKombi()
  Dim i1 As Long
  Dim i2 As Long
  Dim i3 As Long
  Dim i4 As Long
  Dim i5 As Long
  Dim x As String
  For i1 = 1 To 255
    For i2 = 1 To 255
      For i3 = 1 To 255
        For i4 = 1 To 255
          For i5 = 1 To 255
            x = Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5)
          Next
        Next
      Next
    Next
  Next
End Sub

Kan man lave en mere dynamisk kode, hvor man angiver hvor mange karakterer der skal med, i stedet for et fast antal karakterer?
Avatar billede nielle Nybegynder
12. december 2007 - 06:58 #1
Noget i denne stil?

Sub AlleKombi(x As string, l As Int)
    Dim i As Long

    If l > 0 Then
        For i = 1 To 255
            x = x & Chr(i5)
            AlleKombi(x, l-1)
        Next
    Else
        ' Gør noget med x
    End If 
End Sub
Avatar billede tjacob Juniormester
12. december 2007 - 12:03 #2
Hvad skal du bruge det til? Hvordan skal det outputtes?

Jeg mener: Dit eget eksempel giver 255^5 = 1078203909375 kombinationer!!

Det kan jo ikke outputtes....
Avatar billede epimetheus Nybegynder
12. december 2007 - 16:41 #3
Det kunne bla. bruges til at finde passwordet på en Excel Workbook. Der kan man jo blive ved med at prøve password indtil man finder det rigtige.

Jeg havde dog ikke beregnet antallet af muligheder før jeg skrev dette indlæg. Det er et imponerende antal man kommer frem til. Det kommer nok til at tage et stykke tid for computeren og prøve alle sammen igennem.
Avatar billede epimetheus Nybegynder
12. december 2007 - 16:50 #4
Koden virker ikke helt som planlagt.

Jeg går ud fra at variablen i5 bare skal hedde i
x = x & Chr(i5)

Når jeg stepper igennem koden, bliver x i første omgang n antal karakterer lang, og længden bliver derefter forøget med 1 karakter af gangen.
Der bliver altså ikke fundet alle kombinationer med n antal karakterer.
Avatar billede martin_moth Mester
12. december 2007 - 17:07 #5
Du kunne jo starte med at kun se på store/små bogstaver samt tal, som er de mest sandsynlige i et password. Det giver

(28+28+19)^5 = 1.252.332.567, altså kun godt 1000 milliarder kombinationer.

Og det er jo væsenligt mindre end 1.078.203.909.375, som jo er godt en million milliarder kombinationer.

he he
Avatar billede epimetheus Nybegynder
12. december 2007 - 17:51 #6
Er antallet af kombinationer for øvrigt ikke

256^5 = 1.099.511.627.776

Det er jo fra og med 0 til og med 255, som jo giver 256 forskellige karakterer.
Avatar billede epimetheus Nybegynder
12. december 2007 - 18:22 #7
Den korrekte måde at opbygge passwordet ville vel også være

Først at teste med 1 karakter og så 2 karakterer og så 3 karakterer osv. osv.
Avatar billede nielle Nybegynder
12. december 2007 - 18:26 #8
12/12-2007 16:50:18>

Jeg går ud fra at variablen i5 bare skal hedde i> Korrekt.

> Når jeg stepper igennem koden, bliver x i første omgang n antal karakterer lang, og længden bliver derefter forøget med 1 karakter af gangen.

Variablen x skal overføres med ByVal - det lyder som om at du får den overført som ByRef i stedet.
Avatar billede epimetheus Nybegynder
12. december 2007 - 18:55 #9
x bliver ved med at vokse i antal karakterer.
Avatar billede nielle Nybegynder
12. december 2007 - 22:54 #10
Hvordan ser din kode ud?
Avatar billede epimetheus Nybegynder
13. december 2007 - 05:39 #11
Jeg har kun testet i Excel VBA
Her er koden

Sub KaldAlleKombi()
  Dim x As String
  Call AlleKombi(x, 2)
End Sub

Sub AlleKombi(ByVal x As String, l As Long)
    Dim i As Long
    If l > 0 Then
        For i = 1 To 255
            x = x & Chr(i)
            Call AlleKombi(x, l - 1)
        Next
    Else
        Debug.Print x
    End If
End Sub
Avatar billede nielle Nybegynder
14. december 2007 - 21:16 #12
Prøv dette i stedet:

Sub KaldAlleKombi()
    Dim x As String
    Call AlleKombi(x, 2)
End Sub

Sub AlleKombi(ByVal x As String, l As Long)
    Dim i As Long
    If l > 0 Then
        For i = 1 To 255
            Call AlleKombi(x & Chr(i), l - 1)
        Next
    Else
        Debug.Print x
    End If
End Sub
Avatar billede arne_v Ekspert
15. december 2007 - 02:03 #13
måske:

        For i = 0 To 65535
            Call AlleKombi(x & ChrW(i), l - 1)
        Next
Avatar billede nielle Nybegynder
28. december 2007 - 21:36 #14
epimetheus, har du fået kigget på det?
Avatar billede nielle Nybegynder
07. januar 2008 - 17:50 #15
??
Avatar billede epimetheus Nybegynder
30. januar 2008 - 16:54 #16
Så har jeg fået kigget på det.
Jeg har afprøvet det i Excel for at se resultatet visuelt.

Det virker fint.

Sub KaldAlleKombi()
    Dim x As String
    Dim i As Long
    For i = 1 To InputBox("Indtast antal cifre.", "Antal cifre")
      Call AlleKombi(x, i)
    Next
End Sub

Sub AlleKombi(ByVal x As String, l As Long)
    Dim i As Long
    Dim r As Long
    If l > 0 Then
        For i = 33 To 255
            Call AlleKombi(x & Chr(i), l - 1)
        Next
    Else
      Sheet1.Range("A" & Sheet1.Range("A65536").End(xlUp).Row + 1) = x
    End If
End Sub

Jeg har udvidet koden, så den først finder 1 ciffer, derefter 2 cifre osv. osv.

Antallet af kombinationer bliver hurtigt astronomisk, hvilket vist ikke egner sig til at køre i VB. En udvidelse til alle kombinationer i Unicode er vist ikke realistisk.

Tak for hjælpen.
Avatar billede nielle Nybegynder
30. januar 2008 - 19:41 #17
Så smider jeg da et svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester