Avatar billede kartolux Nybegynder
08. maj 2002 - 09:49 Der er 35 kommentarer og
1 løsning

Vurdering af sjældenhed

Hvis denne funktion køres med 10 som værdi for intAntaltegn, hvor lille er sandsynligheden så for, at det samme password kommer 2 gange? Jeg troede det var en god algoritme, men har flere gange konstateret, at det samme password genereres. Selv om der ikke forsøges så mange gange.

Function MakePassword(intAntaltegn)
  For x = 1 To intAntalTegn
    Randomize
    intChooser = Int(Rnd * 2) + 1
    Select Case intChooser
    Case 1
      intWildChar = Int(Rnd * 57) + 65
      If intWildChar => 91 And intWildChar <= 96 Then
        intWildChar = intWildChar + 8
      End If
      strPassword = strPassword & Chr(intWildChar)
    Case Else
      intWildChar = Int(Rnd * 9) + 1
      strPassword = strPassword & intWildChar
    End Select
  Next
  MakePassword = strPassword
End Function
Avatar billede hirayz Nybegynder
08. maj 2002 - 10:08 #1
hvis du sætter password ind i en database kan du jo checke på om det du lige har lavet allerede findes i database og hvis det så gør skal den bare køre funktionen igen
Avatar billede kartolux Nybegynder
08. maj 2002 - 10:16 #2
Det kan jeg bare ikke finde ud af... Hvor det skal indsættes og hvad koden skal være...
Avatar billede hirayz Nybegynder
08. maj 2002 - 10:18 #3
if strPassword = rs("password_felt_i_db") then
Makepassword(10)
end of
Avatar billede hirayz Nybegynder
08. maj 2002 - 10:19 #4
ups
det skal selvfølgelig være End If ikke End Of
Avatar billede kartolux Nybegynder
08. maj 2002 - 10:20 #5
Jamen der er jo flere poster i dben. Skal man så tælle, hvor mange der er?
Avatar billede tjacob Juniormester
08. maj 2002 - 10:35 #6
Det er fordi du anvender Randomize forkert.
Den skal sættes udenfor For-next løkken. Altså som første linie i funktionen.

/tjacob
Avatar billede tjacob Juniormester
08. maj 2002 - 10:37 #7
-Det er fordi løkken kører så hurtigt, at Randomize næsten er ens hver gang. Hvis du sætter den udenfor bliver den "tilstrækkelig" forskellig for hver gang den kaldes. Og Rnd kaldes jo hver gang med sidste værdi som seed, -derfor er det kun nødvendigt at Randomize den første gang den kaldes.
Avatar billede kartolux Nybegynder
08. maj 2002 - 10:39 #8
tjacob -> vil du lave ovenstående kode om, så det sker?
Avatar billede tjacob Juniormester
08. maj 2002 - 10:44 #9
Sådan: (har blot flyttet Randomize):

Function MakePassword(intAntaltegn)
  Randomize
  For x = 1 To intAntalTegn
    intChooser = Int(Rnd * 2) + 1
    Select Case intChooser
    Case 1
      intWildChar = Int(Rnd * 57) + 65
      If intWildChar => 91 And intWildChar <= 96 Then
        intWildChar = intWildChar + 8
      End If
      strPassword = strPassword & Chr(intWildChar)
    Case Else
      intWildChar = Int(Rnd * 9) + 1
      strPassword = strPassword & intWildChar
    End Select
  Next
  MakePassword = strPassword
End Function
Avatar billede tjacob Juniormester
08. maj 2002 - 11:00 #10
Nu hvor jeg nærlæser din funktion, ser jeg at det måske er et andet sted problemet ligger. Anden gang du kalder Rnd (i Case 1), vil den hver anden gang (i snit) have den samme seedværdi (2 eller 1). Det er ikke godt!
Jeg laver lige nogle tests og vender tilbage.
Avatar billede kartolux Nybegynder
08. maj 2002 - 11:14 #11
tjacob -> Alle tiders  :)
Avatar billede tjacob Juniormester
08. maj 2002 - 11:20 #12
Jeg har testet din funktion, og det duer ikke! ud af 200 passwords er der ca. 60 gengangere. Jeg omskriver lige hele din funktion, og vender tilbage.
Avatar billede kartolux Nybegynder
08. maj 2002 - 11:23 #13
tjacob -> Der bliver flere points  :)
Avatar billede tjacob Juniormester
08. maj 2002 - 11:58 #14
Det er Randomize der skaber problemerne. Du skal slet ikke kalde den i funktionen. Du kan kalde den inden (men endelig ikke i en løkke), men det er ikke nødvendigt. Jeg har simplificeret din funktion lidt, og testet den med 10.000 passwords på 10 karakterer, og nu fungerer den:

Function MakePassword(ByVal Antaltegn As Long) As String
    Dim lWildchar As Long, bUnik As Boolean, i As Long
   
    MakePassword = ""
    For i = 1 To Antaltegn
        Do
            bUnik = True
            lWildchar = Int(Rnd * 75) + 48
            If lWildchar > 57 And lWildchar < 65 Then bUnik = False
            If lWildchar > 90 And lWildchar < 97 Then bUnik = False
        Loop Until bUnik = True
        MakePassword = MakePassword & Chr(lWildchar)
    Next i

End Function

/tjacob
Avatar billede tjacob Juniormester
08. maj 2002 - 12:03 #15
Denne funktion tillader at det samme tegn godt må optræde mere end en gang i passwordet, men det vel OK? Ellers kan den sagtens ændres.
Avatar billede kartolux Nybegynder
08. maj 2002 - 12:03 #16
Okay! Før kaldte jeg funktionen med:

ID2 =MakePassword(10)

Hvad skal jeg kalde den med nu?
Avatar billede tjacob Juniormester
08. maj 2002 - 12:04 #17
På samme måde - virker det ikke? -Har du erklæret ID2 som en String?
Avatar billede tjacob Juniormester
08. maj 2002 - 12:05 #18
Hvis ikke så fjern "As String" i funtionen.
Avatar billede kartolux Nybegynder
08. maj 2002 - 12:08 #19
Der kommer en fejl:

Microsoft VBScript compilation error '800a03ee'

Expected ')'

/makepassword.asp, line 2

Function MakePassword(ByVal Antaltegn As Long) As String
--------------------------------------^

Min kode:

<%
Function MakePassword(ByVal Antaltegn As Long) As String
    Dim lWildchar As Long, bUnik As Boolean, i As Long
   
    MakePassword = ""
    For i = 1 To Antaltegn
        Do
            bUnik = True
            lWildchar = Int(Rnd * 75) + 48
            If lWildchar > 57 And lWildchar < 65 Then bUnik = False
            If lWildchar > 90 And lWildchar < 97 Then bUnik = False
        Loop Until bUnik = True
        MakePassword = MakePassword & Chr(lWildchar)
    Next i

End Function

ID2= Makepassword(10)

response.write ID2

%>
Avatar billede tjacob Juniormester
08. maj 2002 - 12:19 #20
Aha. Det må være fordi det er VB-script. Prøv som jeg foreslog at fjerne
"As String" i funktionen. Jeg er heller ikke sikker på at Dim linien er i orden, men jeg kender ikke meget til VB-script. Koden er "ren" VB.

Jeg ved ikke om du kan kalde Randomize direkte i VB-script, men hvis du kan så ville jeg nok sætte Randomize ind lige før ID2= Makepassword(10).
Avatar billede tjacob Juniormester
08. maj 2002 - 12:29 #21
Prøv sådan her:

<%
Function MakePassword(Antaltegn)
    Dim lWildchar
    Dim bUnik
    Dim i
   
    MakePassword = ""
    For i = 1 To Antaltegn
        Do
            bUnik = True
            lWildchar = Int(Rnd * 75) + 48
            If lWildchar > 57 And lWildchar < 65 Then bUnik = False
            If lWildchar > 90 And lWildchar < 97 Then bUnik = False
        Loop Until bUnik = True
        MakePassword = MakePassword & Chr(lWildchar)
    Next i

End Function

Randomize
ID2= Makepassword(10)

response.write ID2

%>
Avatar billede kartolux Nybegynder
08. maj 2002 - 12:45 #22
Nu kommer denne fejl:

Microsoft VBScript compilation error '800a0401'

Expected end of statement

/makepassword.asp, line 16

Next i
-----^
Avatar billede tjacob Juniormester
08. maj 2002 - 12:49 #23
Prøv at fjerne "i" , så der kun står next
Avatar billede kartolux Nybegynder
08. maj 2002 - 12:51 #24
Okay - så virker det! Hvad er forskellen på det gamle script og dette her? (Kort fortalt)
Avatar billede tjacob Juniormester
08. maj 2002 - 13:01 #25
Der er såmænd ikke den store forskel. Du kunne have brugt det gamle, hvis du havde sat Randomize udenfor på samme måde.
Forskelle:
Du skelnede mellem bogstaver og tal, ved at lave to forskellige cases, og i bogstaverne fjernede du de ugyldige ved at lægge 8 til.

Jeg lavede det sådan at du finder et tal mellem 48 - 122 = Alle tal og bogstaver. Og fjerner de ugyldige ved at sige, at den skal finde et nyt tal, og blive ved med det indtil tallet er gyldigt. (Do - loopet.)

-Beklager forvirringen med VB-script. Det havde kørt første gang i "ren" VB.
Avatar billede kartolux Nybegynder
08. maj 2002 - 13:11 #26
Okay! Hvis man nu kører scriptet 50.000 gange, tror du så, at alle de passwords vil være forskellige? Jeg har sat points op til 50  :)

Det kører fint nu.
Avatar billede tjacob Juniormester
08. maj 2002 - 13:22 #27
Som hirayz var inde på: Du kan ikke være 100% sikker, og burde måske lave noget sammenligning via en DB. I sandsynlighedsregning KAN det (næsten) umulige jo ske. Det KAN godt lade sig gøre at slå en sekser 500 gange i træk med en terning. -Det er bare meget usandsynligt!

MHT til dette script: Jeg er ikke så stiv i sandsynlighedsregning, men jeg ville mene at sandsynligheden for at få det samme password (på 10 karakterer) er noget i retning af: 60^10 = 6^17, hvilket vil sige at det sker ca. 1 gang ud af 10 milliarder med 50.000 passwords.
Avatar billede tjacob Juniormester
08. maj 2002 - 13:23 #28
en tastefejl: 60^10 er cirka lig 6 * 10^17
Avatar billede kartolux Nybegynder
08. maj 2002 - 13:27 #29
Okay - jeg accepterer den lille sandsynlighed :0)
Avatar billede tjacob Juniormester
08. maj 2002 - 13:30 #30
Jeg vil prøve at køre programmet i et loop på 100.000, og derefter teste for gengangere, men det vil tage et par timer - og jeg kan ikke gøre det her (er på arbejde). Men jeg prøver i aften.
Avatar billede kartolux Nybegynder
08. maj 2002 - 13:40 #31
Okay  :)
Avatar billede tjacob Juniormester
08. maj 2002 - 13:42 #32
NB: Den udregning jeg kom med gælder kun for "ægte" tilfældige tal.
Da Randomize og Rnd kun er pseudo-tilfældige, skal det tages med et (stort)gran salt. Jeg mener at Randomize genererer efter systemtimeren i millisekunder, dvs at den kun har : 24*60*60*1000=86400000 forskellige værdier. Såvidt jeg kan se betyder det at der kun er 86400000 forskellige kombinationer, hvilket betyder at det er ca. 1 gang ud af 1700 for hver gang du genererer 50.000 passwords!
Avatar billede hirayz Nybegynder
08. maj 2002 - 13:43 #33
hvis det var mig ville jeg for en sikkerheds skyld checke i DB'en om passwordet findes i forvejen ...
Avatar billede kartolux Nybegynder
08. maj 2002 - 13:52 #34
Når man har kaldt med:
ID2 = MakePassword(10)
Kunne man sige:
Se om der findes en record med værdien i databasen
Hvis den findes så: ID2 = MakePassword(10)  igen
End If
Tilskriv værdien til databasen
Avatar billede hirayz Nybegynder
08. maj 2002 - 14:24 #35
øhhh er der bare helt tomt (er lige en test!)
Avatar billede hirayz Nybegynder
08. maj 2002 - 14:28 #36
da jeg lige ville læse den nyeste kommentar:

http://www.friserverplads.dk/hirayz/exp.dk1.jpg
http://www.friserverplads.dk/hirayz/exp.dk2.jpg

da jeg så skrev den der test kommentar kom det hele igen
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