Domanda

Qual è il modo migliore per generare codice un GUID o UUID in C ++ senza fare affidamento su uno strumento specifico per la piattaforma? Io sto cercando di fare identificatori unici per gli oggetti in una simulazione, ma non possono contare su implementazione di Microsoft in quanto il progetto è multi-piattaforma.

Note:

  • Dato che si tratta di un simulatore, ho Non avete davvero bisogno di crittografia casualità.
  • Sarebbe meglio se questo è un numero a 32 bit.
È stato utile?

Soluzione

Se si può permettersi di utilizzare Boost, poi c'è un UUID libreria che dovrebbe fare il trucco. E 'molto semplice da usare -. Controllare la documentazione e questa risposta

Altri suggerimenti

In Linux: l'uomo uuid

sulla vittoria: controllare per la struttura e la funzione UUID UuidCreate in MSDN

[modifica] la funzione apparirebbe come questo

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;
}

Se non può permettersi di utilizzare Boost, poi c'è una biblioteca molto minimale che ho implementato che agisce semplicemente come un wrapper implementazione guid nativo di ogni sistema operativo. Dovrebbe funzionare su Windows (utilizzando CoCreateGuid), Linux (usando libuuid), MacOS (utilizzando CFUUID), iOS (anche utilizzando CFUUID) e Android (tramite JNI chiama a java.util.UUID). La funzione guid generazione ha una diversa implementazione su ciascun sistema ma c'è un'unica implementazione generico per la comparazione, stringifying, e l'analisi.

E 'MIT concesso in licenza e disponibili su GitHub:

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

semplicemente utilizzando qualunque GUID / UUID è presente sulla piattaforma di destinazione è la cosa migliore. Facendo bene è difficile (andiamo lo shopping;)).

La probabilità di una collisione tra due identificatori di implementazioni diverse, ma ben eseguito dovrebbe essere ben al di là di ogni ragionevole possibilità di accadere durante la vita di questo universo.

Un generatore di GUID di solito si basa su caratteristiche hardware della macchina, di solito cose come indirizzi MAC o IP. L'unica cosa che si può fare che è assolutamente indipendente dalla piattaforma è utilizzare un qualche tipo di PRNG testa di serie manualmente o seminato da una sorgente di tempo. Questo di solito non genera un vero identificatore univoco globale, nel senso che si ha la garanzia che nessuno al mondo genera lo stesso numero.

Bene un'insolito (?) Soluzione sarebbe quella di utilizzare un servizio web per ottenere il GUID ma dubito che questo sarà una buona soluzione per un programma C ++ soprattutto se non è abilitato di rete.

Ecco un URL che potrebbe tornare utile se si sceglie di perseguire questa opzione: http: //www.hoskinson.net/GuidGenerator/default.asp

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top