Indipendente dalla piattaforma generazione GUID in C ++?
-
23-08-2019 - |
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.
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:
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