Wie um eine GUID zu generieren, die in C?
Ich soll zum generieren von guids einfügen in eine SQLite-Datenbank (d.h. keine Unterstützung von der db selbst). Ich möchte jedoch die Kontrolle über bestimmte Eigenschaften:
- Orderedness für die Generierung Erhöhung der guid-Werte.
- Computer Unabhängigkeit. Die db ist öffentlich und kann/können nicht wollen, guids, eine Person, trace-Daten, die auf eine bestimmte Maschine.
- 'Genug' Zufälligkeit. Die guids sind keys in der db, die gehen, die zusammengeführt werden, mit vielen anderen dbs und Recht groß, was bedeutet, dass das vortäuschen einer guid wie viele algorithmen tun, ist nicht gut.
- Ich kann mit der Verwendung des system-spezifische APIs aber bitte einen link auf Windows-und Linux-Funktionen, und so etwas wie SQLite ist am günstigsten, wo kann ich einfach code jemand anderes schrieb.
- Ich würde auch lieber code, das ist OK für die Verwendung in einer kommerziellen Anwendung.
mögliche Duplikate von Einfache Erzeugung der GUID in C
InformationsquelleAutor chacham15 | 2011-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie entweder verwenden, oder schau dir den code von Boost.Uuid :
http://www.boost.org/doc/libs/1_47_0/libs/uuid/index.html
Es ist eine C++ - Bibliothek, aber noch können Sie im inneren zu finden, wie die code-Autor abgerufen die Uuid, die auf mehreren Systemen. Letztes mal habe ich überprüft (Januar 2010) fand ich zumindest die folgenden Implementierungen für Windows und Linux/Solaris (diese info könnte veraltet sein):
UUID/GUID Linux/Solaris
Öffnen einer Datei
/dev/urandom
und lese genug bytes (16), um eine GUID/UUID.UUID/GUID unter Windows
Verwenden Sie die folgenden WinAPI Funktionen
Andere Implementierungen
Die Wikipedia-Seite auf GUID/UUID hat eine Liste von alternativen Implementierungen, die Sie verwenden könnte/Studie:
https://en.wikipedia.org/wiki/UUID#Implementations
Über Ihre Bedingungen
Es ist ein GUID/UUID-Typ, das ist immer Zufall (die version 4), was bedeutet, dass es kompatibel mit anderen GUID/UUID Semantik, Sie sollten das respektieren.
Jetzt wollen Sie, dass die GUID/UUID zu bestellen in der Zeit. Der einzige Weg, das zu tun, ohne eine Schwächung der GUID/UUID Zufälligkeit wäre Präfix der 16-byte-GUID/UUID mit einem unsigned integer (was machen würde, Ihre id-Daten 20 Byte oder mehr, je nach integer). Generieren Sie einfach eine GUID/UUID und erhöhen die integer.
ist klein genug, auf linux, dass es nicht erforderlich boost-uuid-Mechanismus : Ist das nicht was meine Antwort war? Blick auf Boost, um zu sehen/Auszug wie es war getan auf jeder Plattform?...
InformationsquelleAutor paercebal
Einem Ort zu suchen, eine Antwort zu erstellen, der eine GUID enthält viele Elemente, die der Autor sucht, ist in PHP .. http://us3.php.net/uniqid .. In Ihre Beispiele, die Sie besprechen, wie man hinzufügen den server-Namen, Datenbank-Namen, und andere Elemente, die eine GUID ist.
Jedoch, um die Notwendigkeit für eine C-basierte GUID-Funktion, hier ist der code, basierend auf einer JavaScript-Funktion .. Erstellen von GUID /UUID in JavaScript? .. dieses Beispiel verwendet die RegEx zu erstellen, die GUID.
Unten ist code, der erstellt eine GUID basierend auf der JavaSCript-Beispiel. Ich bin sicher, es gibt elegantere Lösungen gibt. Das ist etwas zusammengeschustert, zu helfen, geben ein gutes Beispiel für andere Folgen.
Hinweis: strings enden mit einem 0x00-Zeichen.
Dies ist eine version 4 random UUID und ist vollkommen gültig.
Gut, gültig, außer für die außerordentlich schwache random seeding.
Könnte ein wenig verbessert durch den Ersatz der beiden letzten Fällen mit
default: break;
, initialisierenc = szTemp[t]
- und einbauenswitch (c)
.InformationsquelleAutor E Net Arch
First off, GUIDs sind nicht zufällig, Sie sind sehr gut definiert mathmatically.
Wie für Ihr problem, legen Sie den GUID-Erstellung in der Datenbank selbst als eine gespeicherte Prozedur, auf diese Weise das system ist Plattform-unabhängig. Dann stellen Sie die GUID ein auto-increment-integer-Präfix der Datenbank-ID. Das Präfix ermöglicht Datenbanken zusammengeführt werden leicht. Die Datenbank-ID muss eindeutig sein für jede Datenbank. Wenn Sie die Kontrolle jeder Datenbank, dann ist es einfach, um sicherzustellen, dass diese eindeutig sind. Andernfalls müssen Sie möglicherweise eine lookup-system, welche Karten der Datenbank IP-Adresse (oder eine andere unique identifier) , eine eindeutige Datenbank-ID.
Wenn Sie nicht über gespeicherte Prozeduren erstellen Sie dann eine Tabelle mit "NextIndex" und "DatabaseID" - Felder und aktualisieren Sie Sie, wenn ein neuer Datensatz Hinzugefügt wird:
die Datenbank-ID kann eine MAC-Adresse, Betriebssystem generierte GUID, etc
InformationsquelleAutor Skizz