webentwicklung-frage-antwort-db.com.de

Plattformunabhängige GUID Generierung in C ++?

Was ist der beste Weg, um programmgesteuert eine GUID oder UUID in C++ zu generieren, ohne auf ein plattformspezifisches Tool angewiesen zu sein? Ich versuche, eindeutige Bezeichner für Objekte in einer Simulation zu erstellen, kann mich aber nicht darauf verlassen über die Implementierung von Microsoft, da das Projekt plattformübergreifend ist.

Anmerkungen:

  • Da dies für einen Simulator ist, brauche ich keine kryptografische Zufälligkeit.
  • Am besten ist es, wenn es sich um eine 32-Bit-Zahl handelt.
54
Moses Schwartz

Wenn Sie es sich leisten können, Boost zu verwenden, gibt es eine UUID Bibliothek, die den Trick machen sollte. Es ist sehr einfach zu bedienen - überprüfen Sie die Dokumentation und diese Antwort .

45
Anonymous

unter linux: man uuid

on win: Überprüfen Sie die UUID-Struktur und die UuidCreate-Funktion in msdn

[edit] die funktion würde so aussehen

extern "C"
{
#ifdef WIN32
#include <Rpc.h>
#else
#include <uuid/uuid.h>
#endif
}

std::string newUUID()
{
#ifdef WIN32
    UUID uuid;
    UuidCreate ( &uuid );

    unsigned char * str;
    UuidToStringA ( &uuid, &str );

    std::string s( ( char* ) str );

    RpcStringFreeA ( &str );
#else
    uuid_t uuid;
    uuid_generate_random ( uuid );
    char s[37];
    uuid_unparse ( uuid, s );
#endif
    return s;
}
40
ubik

Wenn Sie es sich nicht leisten können, Boost zu verwenden, dann gibt es eine sehr minimale Bibliothek, die ich implementiert habe und die einfach als Wrapper um die native Guid-Implementierung jedes Betriebssystems fungiert. Es sollte unter Windows (mit CoCreateGuid), Linux (mit libuuid), MacOS (mit CFUUID), iOS (auch mit CFUUID) und funktionieren Android (mit JNI-Aufrufen an Java.util.UUID). Die Guid-Generierungsfunktion hat auf jedem System eine andere Implementierung, es gibt jedoch eine einzige generische Implementierung zum Vergleichen, Stringifizieren und Parsen.

Es ist MIT lizenziert und auf GitHub erhältlich:

https://github.com/graeme-hill/crossguid

14
Graeme Hill

Am besten ist es, einfach die auf der Zielplattform vorhandene guid/uuid zu verwenden. Es richtig zu machen ist schwer (lass uns einkaufen gehen;)).

Die Wahrscheinlichkeit einer Kollision zwischen zwei beliebigen Bezeichnern aus unterschiedlichen, aber gut ausgeführten Implementierungen sollte deutlich höher sein als die Wahrscheinlichkeit, dass dies zu Lebzeiten dieses Universums passiert.

2
ShuggyCoUk

Ein GUID Generator stützt sich normalerweise auf die Hardwareeigenschaften des Rechners, normalerweise auf MAC-Adressen oder IPs. Das einzige, was Sie tun können, was absolut plattformunabhängig ist, ist die Verwendung einer Art von PRNG manuell gesetzt oder von einer bestimmten Zeitquelle gesetzt. Dies erzeugt normalerweise keine echte global eindeutige Kennung in dem Sinne, dass Sie garantiert sind, dass niemand auf der Welt dieselbe Zahl erzeugt.

1
shoosh