GUID Generator

Bild

Betrifft: GUID Generator
von: Alex
Geschrieben am: 06.05.2015 12:57:34

Hallo zusammen,
ich habe eine Frage zur Erstellung von GUIDs. Habe auch was zusammengesucht und es funktioniert. Das Grundprinzip mit der API- Funktion ist mir klar aber die einzelnen Schritte nachzuvollziehen fällt mir schwer. Könnt ihr mir dabei helfen? Evt. die einzelnen Schritte zu kommentieren mit dem was sie tun?


Type GUID
   data1 As Long
   data2 As Integer
   data3 As Integer
   data4(7) As Byte
End Type
 
Declare Function CoCreateGuid Lib "OLE32.DLL" (pGuid As GUID) As Long
Public Function NewGUID() As String
  Dim result As String
  
  Dim uid As GUID
  CoCreateGuid uid
  
 
  result = hex0(uid.data1, 8) & "-" & _
           hex0(uid.data2, 4) & "-" & _
           hex0(uid.data3, 4) & "-" & _
           hex0(uid.data4(0), 2) & hex0(uid.data4(1), 2) & "-"
  
  Dim i As Integer
  For i = 2 To 7
    result = result & hex0(uid.data4(i), 2)
  Next
  
  NewGUID = result
End Function
 
Private Function hex0(n As Variant, digits As Integer) As String
Dim k As Integer
    k = Len(Hex(n))
  hex0 = String(digits - Len(Hex(n)), "0") & Hex(n)
 End Function

Bild

Betrifft: AW: GUID Generator
von: Nepumuk
Geschrieben am: 06.05.2015 16:11:05
Hallo,
du bekommst in der Struktur eine 8Bit- zwei 4Bit und 8 2Bit-Zahlen zurück die werden in Hexadezimalzahlen umgewandelt, bedarfsweise wird von vorne mit Nullen aufgefüllt. Geht das doch einfach mit F8 durch und schau im Lokalfenster wie sich die Variablenwerte ändern.
Gruß
Nepumuk

Bild

Betrifft: AW: GUID Generator
von: Michael
Geschrieben am: 06.05.2015 16:13:05
Hi Alex,
anstandshalber könntest du ja die Quelle mit angeben, von der Du den Schnipsel 1:1 übernommen hast:
http://dbwiki.net/wiki/VBA_Tipp:_GUID_-_Wie_erzeuge_ich_eindeutige_Schl%C3%BCssel
Ich denke, Dein Hauptproblem ist die Funktion hex0, weiter oben werden nur die von CoCreateGuid zurückgelieferten Variablen, die ganz oben unter type definiert wurden, zurückgeliefert und mit "-" zusammengestückelt. Dabei ist data4(7) ein array mit 8 Bytes (wird von 0 bis 7 gezählt), dessen erste zwei vor dem letzten "-" stehen, wie weiteren danach - die einzelnen "Felder" des Arrays werden dann in der For-Schleife ausgelesen.
Füg mal den Schnipsel mit ein und schau Dir die Ausgabe im "Direktfenster" (Strg+g) des VB-Editors an:


Sub test()
For i = 1 To 32
  Debug.Print i * 10 & ": " & hex0(i * 10, 8)
Next
End Sub
string(Anzahl,Zeichen) erzeugt schlicht einen String mit der Anzahl des angegebenen Zeichens. hex erzeugt einen String (das kannst Du selbst in der Hilfe nachlesen) mit den hex-Werten einer Zahl.
hex0 wandelt also zunächst mit Len(Hex(n)) n in eine hex-String um und speichert dessen Länge in k.
Dann wird ein String mit führenden Nullen erzeugt, wobei sich die Anzahl aus der übergebenen Längenangabe digits und der errechneten Länge errechnet.
Das war's auch schon.
Happy Exceling,
Michael
P.S.: die Originalfunktion des Autors lautet übrigens so:

Private Function hex0(n, digits As Integer) As String
  hex0 = Hex(n)
  hex0 = String(digits - Len(hex0), "0") & hex0
End Function
und ist gegenüber dem, was Du geändert hast, deutlich optimierter. Wenn man schon ein k für die Länge des Strings einführt, sollte man es auch verwenden, und zwar in *Deiner* Zeile so:
hex0 = String(digits - k), "0") & Hex(n)
In Deinem Schnipsel wird *dreimal* die Funktion hex(n) aufgerufen, und bei sehr vielen Daten kostet das unnütz Zeit.
Im Original konvertiert der Autor nur *einmal* in die Variable hex0 und verwendet sie dann noch zweimal weiter.

Bild

Betrifft: AW: GUID Generator
von: Alex
Geschrieben am: 06.05.2015 18:36:44
danke schonmal euch beiden.macht es schon etwas klarer.jedoch noch zwei direktere fragen:
1.wofür die führenden nullen?
2.der aufruf "cocreateuid uid" gibt ja eine uuid zurück korrekt?
wie kommt das dass "uid.data1" weiß welchen teil der zurückegebenen uuid es bekommt?
also der cocreatuid aufruf und die type deklsration ist eig das problem für mich.
und ja.nächstes mal nenne ich die quelle (hab ja zumindest erwähnt dass ich es zusammen gesucht hab^^)

Bild

Betrifft: AW: GUID Generator
von: Nepumuk
Geschrieben am: 06.05.2015 18:53:19
Hallo,
1. Weil eine GUID ein genau vorgegebenes Format haben muss (8-4-4-4-12 Zeichen).
2. Das ist in der Funktion der du die Struktur übergibst so festgelegt.
Gruß
Nepumuk

 Bild

Beiträge aus den Excel-Beispielen zum Thema "GUID Generator"