Exemple de génération d'UUID à l'aide de Boost en C ++

94

Je souhaite générer uniquement des UUID aléatoires, car il est simplement important que les instances de mon programme aient des identifiants uniques. J'ai regardé dans Boost UUID , mais je n'arrive pas à générer l'UUID car je ne comprends pas quelle classe et quelle méthode utiliser.

J'apprécierais que quelqu'un puisse me donner un exemple de la façon d'y parvenir.

Nikola
la source

Réponses:

164

Un exemple basique:

#include <boost/uuid/uuid.hpp>            // uuid class
#include <boost/uuid/uuid_generators.hpp> // generators
#include <boost/uuid/uuid_io.hpp>         // streaming operators etc.

int main() {
    boost::uuids::uuid uuid = boost::uuids::random_generator()();
    std::cout << uuid << std::endl;
}

Exemple de sortie:

7feb24af-fc38-44de-bc38-04defc3804de

Georg Fritzsche
la source
4
Et comment l'attribueriez-vous à une chaîne? Parce que j'ai une base commune pour chaque instance et que j'aurais besoin de concaténer l'UUID à une base. Merci encore!
Nikola
22
@nik: Utilisez le support de streaming - il y a un stringstreamexemple. Ou laissez boost::lexical_cast<std::string>(uuid)faire cela pour vous.
Georg Fritzsche
15
Quant aux doubles parantheses: Le premier construit une instance de random_generator, le second utilise operator()sur cette instance. Vous devez enregistrer le générateur et l'appeler operator()si vous souhaitez générer plus d'un uuid:random_generator rg; uuid ui = rg();
Georg Fritzsche
34
@Nikola: utilisez boost :: uuids :: to_string (uuid) pour stringifier les uuids
King
2
@GeorgFritzsche Ensemble, l'heure exacte et l'adresse réseau individuelle de la machine sont uniques. Je pensais donc que cela pourrait être une bonne clé pour la fonction de hachage. Je n'ai pas besoin des valeurs claires plus tard. Mais votre idée m'a apporté une idée. Il peut être judicieux d'utiliser l'heure et l'adresse réseau comme graine pour le générateur de nombres aléatoires.
danijar
34

La réponse de Georg Fritzsche est correcte mais peut-être un peu trompeuse. Vous devez réutiliser le générateur si vous avez besoin de plus d'un uuid. Peut-être que c'est plus clair de cette façon:

#include <iostream>

#include <boost/uuid/uuid.hpp>            // uuid class
#include <boost/uuid/uuid_generators.hpp> // generators
#include <boost/uuid/uuid_io.hpp>         // streaming operators etc.


int main()
{
    boost::uuids::random_generator generator;

    boost::uuids::uuid uuid1 = generator();
    std::cout << uuid1 << std::endl;

    boost::uuids::uuid uuid2 = generator();
    std::cout << uuid2 << std::endl;

    return 0;
}
Nikko
la source
1
Pourquoi devriez-vous réutiliser les générateurs? S'agit-il d'une optimisation des performances ou d'un conseil de sécurité?
Fred
5
Ce ne serait pas un très bon identifiant unique universel si l'utilisation d'un nouveau générateur provoquait des problèmes d'unicité.
xaxxon
@xaxxon Avez-vous une documentation concernant le problème d'unicité lors de la création d'un nouveau générateur.
Saneesh kumar
1
@Saneeshkumar C'est un "identifiant unique universel" et non un "identifiant unique de ce générateur" pour une raison.
xaxxon du
1
Apprenez de moi et faites en sorte que les générateurs filent en local. Ils sont très chers à semer
James