Question

Quelle est la meilleure façon de générer un programme GUID ou UUID en C ++ sans compter sur un outil spécifique à la plateforme? Je suis en train de faire des identifiants uniques pour les objets dans une simulation, mais ne peut pas compter sur la mise en œuvre de Microsoft que le projet est multi-plateforme.

Notes:

  • Puisque c'est un simulateur, je n'a pas vraiment besoin cryptographique aléatoire.
  • Il serait préférable que ce chiffre est de 32 bits.
Était-ce utile?

La solution

Si vous pouvez vous permettre d'utiliser Boost, puis il y a une bibliothèque UUID qui devrait faire la tour. Il est très simple à utiliser -. Consultez la documentation et cette réponse

Autres conseils

sur linux: l'homme UUID

sur la victoire: consultez pour la structure et la fonction UUID UuidCreate dans msdn

[modifier] la fonction apparaît comme 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 se permettre d'utiliser Boost, alors il y a une bibliothèque très minime que je mis en œuvre qui agit simplement comme une enveloppe autour de la mise en œuvre native guid de chaque système d'exploitation. Il devrait fonctionner sur Windows (en utilisant CoCreateGuid), Linux (en utilisant libuuid), MacOS (en utilisant CFUUID), iOS (également en utilisant CFUUID) et Android (avec appels JNI à java.util.UUID). La fonction de génération guid a une implémentation différente sur chaque système mais il est unique implémentation générique pour comparer, stringifying, et l'analyse syntaxique.

Il est MIT sous licence et disponible sur GitHub:

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

tout simplement en utilisant tout guid / UUID est présent sur la plate-forme cible est le meilleur. Le faire est juste dur (nous allons faire du shopping;).)

La probabilité d'une collision entre deux identifiants de différentes implémentations mais bien exécutées devrait être bien au-delà toute chance raisonnable de se produire dans la vie de cet univers.

Un générateur de GUID repose généralement sur les caractéristiques matérielles de la machine, généralement des choses comme les adresses IP ou MAC. La seule chose que vous pouvez faire ce qui est tout à fait indépendante de la plate-forme est d'utiliser une sorte de PRNG tête de série manuellement ou tête de série d'une source de temps. Habituellement, cela ne génère pas un véritable identificateur global unique dans le sens où vous êtes assuré que personne dans le monde génère le même nombre.

Et bien un contretemps (?) Solution serait d'utiliser un service Web pour obtenir le GUID, mais je doute que ce sera une bonne solution pour un programme C ++ surtout si elle est réseau non activée.

Voici une URL qui pourrait être utile si vous choisissez de poursuivre cette option: http: //www.hoskinson.net/GuidGenerator/default.asp

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top