Avatar billede winkill Nybegynder
18. september 2001 - 11:39 Der er 10 kommentarer og
1 løsning

Unikt ID

Inden jeg bliver sindsyg og kyler min skærm ud af vinduet vil jeg da lige høre om der er en venlig sjæl der kan hjælpe mig.

Jeg har en Collection med X antal objekter. Nogle af disse objekter vil altid ligge i min Collection, mens andre bliver udskiftet med jævne mellemrum.
For at kunne holde styr på hvert objekt har de alle fået tildelt en type og et ID.
Type er generelt for en Class mens ID er unikt for hvert \"instance\" af et objekt.

Problemet er, at jeg skal kunne skabe et 100% unikt ID for hvert eneste objeck. Jeg prøvede i første omgang med en Long, som jeg lagde 1 til hver gang jeg lavede et nyt instance af et objekt (objektet fik så id \"#\" og et nummer) - men en Long kan kun være op til et vist tal og derefter vil der opstå en Overflow fejl eller noget lignende, så jeg er nød til at kunne genbruge et unikt id, så snart objektet der har dette id bliver fjernet fra min Collection.

Spørgsmålet er, hvordan laver jeg en uniqueID generator der er i stand til at genbruge et ID ?
Avatar billede giuggio97 Nybegynder
18. september 2001 - 11:43 #1
Har du en forbindelse til en MSSQL?
Avatar billede winkill Nybegynder
18. september 2001 - 11:44 #2
Ja, men det kører for langsomt hvis jeg skal bruge MSSQL funktionen NEWID().
Avatar billede giuggio97 Nybegynder
18. september 2001 - 11:51 #3
For langsomt? Er du sikker på at du bruge det korrekt?

strGUID = cn.Execute(\"SELECT NEWID()\")(0)

Avatar billede winkill Nybegynder
18. september 2001 - 11:54 #4
Ja, jeg er sikker på at jeg bruger det korrekt.

Desuden vil jeg ikke gøre et produkt afhængig af MS SQL udelukkende for at kunne bruge NEWID funktionen. Det er simpelthen en alt for dyr løsning.
Avatar billede winkill Nybegynder
18. september 2001 - 12:02 #5
Jeg fandt selv en løsning...

Private myUniqueIDs As String

Public Function CreateUniqueID() As String
    Static lUIDC As Long
    While InStr(1, myUniqueIDs, \"#\" & Hex(lUIDC) & \";\") > 0
        lUIDC = lUIDC + 1
    Wend
    myUniqueIDs = myUniqueIDs & \"#\" & Hex(lUIDC) & \";\"
    CreateUniqueID = \"#\" & Hex(lUIDC) & \";\"
End Function

Public Sub ReleaseUniqueID(sUID As String)
    Dim lPos As Long
    Dim lEnd As Long
    lPos = InStr(1, myUniqueIDs, sUID)
    If lPos = 0 Then Exit Sub
    lEnd = InStr(lPos, myUniqueIDs, \";\")
    If lPos > 1 And lEnd < Len(myUniqueIDs) Then
        myUniqueIDs = Left(myUniqueIDs, lPos - 1) & Mid(myUniqueIDs, lEnd + 1)
    ElseIf lPos > 1 Then
        myUniqueIDs = Left(myUniqueIDs, lPos - 1)
    ElseIf lEnd < Len(myUniqueIDs) Then
        myUniqueIDs = Mid(myUniqueIDs, lEnd + 1)
    Else
        myUniqueIDs = \"\"
    End If
End Sub
Avatar billede winkill Nybegynder
18. september 2001 - 12:03 #6
Static lUIDC As Long skal selvfølgeligt være Dim lUIDC As Long
Avatar billede giuggio97 Nybegynder
18. september 2001 - 12:03 #7
Hvad med denne her?

strID = Format(Now, \"yyyymmddhhmmss\") & Timer * 100
Avatar billede jelzin101 Praktikant
18. september 2001 - 12:05 #8
jeg ville foreslå et 2d array med en id i indgangens første felt og en \"on/off\" i feltets anden indgang så kan du hver gang du fjerner et objekt sætte dets id til \"off\" og vice verca..
Avatar billede winkill Nybegynder
18. september 2001 - 12:09 #9
giuggio97 > Jeg har lige testet din kode sådan her:
Debug.Print Format(Now, \"yyyymmddhhmmss\") & Timer * 100
Debug.Print Format(Now, \"yyyymmddhhmmss\") & Timer * 100

Outputet var:
200109181205034350377
200109181205034350377

Altså to knapt-så-unikke ID.

jelzin101 > Har du et eksempel på dette ? Hvor meget ville det ca. optage i RAM\'en at have mulighed for at skabe 1000000 unikke IDs ? Hvor lang tid vil det tage at skabe unique ID nummer 1000000 ?
Avatar billede winkill Nybegynder
18. september 2001 - 12:11 #10
Er der ikke en funktion i Vb eller evt. i Windows 2000 API\'en der kan skabe unique id ?
Avatar billede giuggio97 Nybegynder
18. september 2001 - 12:14 #11
Min ID er basaret på at der findes kun et tal til år, måned, dag, time, min, sek og millisek.
Problemet er at det er afhængig af hastigheden.
Man kan bare løse det med et ekstra counter.

Kan du ikke tilføje en counter?

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