web-dev-qa-db-fra.com

Indépendant de la plate-forme GUID en C ++?

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:

  • Puisque c'est pour un simulateur, je n'ai pas vraiment besoin d'aléatoire cryptographique.
  • Il serait préférable que ce soit un nombre de 32 bits.
54
Moses Schwartz

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 .

45
Anonymous

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

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:

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

14
Graeme Hill

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.

2
ShuggyCoUk

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.

1
shoosh