Quelle est la meilleure façon de générer par programme un GUID ou UUID en C++ sans s'appuyer sur un outil spécifique à la plate-forme? J'essaie de créer des identificateurs uniques pour les objets dans une simulation, mais je ne peux pas compter sur la mise en œuvre de Microsoft car le projet est multi-plateforme.
Remarques:
Si vous pouvez vous permettre d'utiliser Boost, il existe une bibliothèque UUID qui devrait faire l'affaire. C'est très simple à utiliser - consultez la documentation et cette réponse .
sur linux: man uuid
sur la victoire: consultez la structure UUID et la fonction UuidCreate dans msdn
[modifier] la fonction ressemblerait à ceci
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;
}
Si vous ne pouvez pas vous permettre d'utiliser Boost, il existe une bibliothèque très minimale que j'ai implémentée qui agit simplement comme un wrapper autour de l'implémentation guid native de chaque système d'exploitation. Il devrait fonctionner sur Windows (en utilisant CoCreateGuid
), Linux (en utilisant libuuid
), MacOS (en utilisant CFUUID
), iOS (en utilisant également CFUUID
), et Android (en utilisant les appels JNI à Java.util.UUID
). La fonction de génération de GUID a une implémentation différente sur chaque système, mais il existe une implémentation générique unique pour comparer, filtrer et analyser.
Il est MIT sous licence et disponible sur GitHub:
Il est préférable d'utiliser simplement guid/uuid sur la plate-forme cible. Faire les choses correctement est difficile (allons faire du shopping;)).
La probabilité d'une collision entre deux identifiants provenant d'implémentations différentes mais bien exécutées devrait être bien au-delà de toute chance raisonnable de se produire dans la vie de cet univers.
Un générateur GUID s'appuie généralement sur les caractéristiques matérielles de la machine, généralement des adresses MAC ou IP. La seule chose que vous pouvez faire qui soit absolument indépendante de la plate-forme est d'utiliser une sorte de PRNG prédéfini manuellement ou prédéfini à partir d'une source de temps. Cela ne génère généralement pas un véritable identifiant global unique dans le sens où vous êtes assuré que personne dans le monde ne génère le même nombre.