2009-09-03 4 views
10

Ich fühle mich wie GUID/UUID Fragen wurden hier zu Tode getan, aber ich kann nicht ganz finden, was ich suche. Ich brauche eine Funktion, die V4-GUIDs in C erzeugt, d. H. Etwas, das im Wesentlichen mit Guid.NewGuid von C# kompatibel ist.Einfache Generierung von GUID in C

Dies muss unter Windows (XP, Server 2003/8, etc) und 3 verschiedenen Distributionen von Unix (AIX, Sun und HP) funktionieren.

Ich habe einige der Spezifikationen White Papers gesehen, einige, die sogar einige Beispielimplementierungen haben, aber es scheint immer ein Problem mit richtigen Zufallszahlen zu geben, oder sie erzeugen nur V1 oder VU3 UUIDs, usw. Die wikipedia page für UUIDs verwiesen mich auf einige Sample-Bibliotheken, aber diese sind viel zu schwer für das, was ich hier erreichen möchte.

Ich fühle mich ziemlich stark, dass ich selbst etwas umsetzen könnte, aber ich möchte keine Zeit damit verschwenden, das Rad neu zu erfinden, wenn es etwas wirklich Einfaches und Leichtes gibt. Ich könnte einfach vorbeikommen. Hat irgendwer etwas oder etwas?

Danke.

Antwort

10

CoCreateGuid ist Standard für alle Formen von Windows. Der Linux-Standard ist libuuid, der Standard für alle Linux-Versionen ist und leicht sein sollte. Ich kenne keine Bibliothek, die sowohl für Windows als auch für Unix funktioniert. Ich denke, dass ein #if-Zweig für Windows und Linux hier eigentlich angebracht ist.

+1

Müssen Sie tatsächlich die gleiche Binärdatei auf beiden Systemen verteilen? Oder kompilieren Sie einfach die gleiche Quelle? Du fragst nicht. Wenn Sie die gleiche Binärdatei wirklich verteilen müssen, können Sie wahrscheinlich die Quelle für libuuid abrufen und sie in Ihre Binärdatei kompilieren, was sie plattformübergreifend macht. –

+3

@Morinar: Dies * ist * plattformunabhängig. Sie wickeln unter einer gemeinsamen Schnittstelle einige OS-spezifische APIs ein. Am Ende müssen Sie die Anwendung unter jeder Kategorie von Betriebssystemen kompilieren, so kompilieren Zeitschaltuhr für die Auswahl der richtigen Implementierung der gleichen Schnittstelle sollte die Aufgabe erledigen. Einige gute Bibliotheken, die ich kenne, verwenden diesen "Trick". Siehe zum Beispiel boost :: thread. –

+0

Kompilieren Sie einfach die gleiche Quelle ... ein #if-Zweig ist vollkommen akzeptabel. Ist es eine Garantie, dass meine Unix-Distributionen libuuid sind? Ich habe nicht wirklich die Fähigkeit, alle unsere Kunden dazu zu zwingen, sie zu installieren oder sogar richtig zu verpacken. – Morinar

2

Tatsächlich ruft CoCreateGuid() UuidCreate(). Die generierten Datentypen (UUID,GUID) sind genau gleich. Unter Windows können Sie beide Funktionen zum Erstellen von GUIDs verwenden