Beispiel für die UUID-Generierung mit Boost in C ++

94

Ich möchte nur zufällige UUIDs generieren, da es für Instanzen in meinem Programm nur wichtig ist, eindeutige Bezeichner zu haben. Ich habe mir die Boost-UUID angesehen , kann die UUID jedoch nicht generieren, da ich nicht verstehe, welche Klasse und Methode ich verwenden soll.

Ich würde mich freuen, wenn mir jemand ein Beispiel geben könnte, wie dies erreicht werden kann.

Nikola
quelle

Antworten:

164

Ein einfaches Beispiel:

#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;
}

Beispielausgabe:

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

Georg Fritzsche
quelle
4
Und wie würden Sie es einer Zeichenfolge zuweisen? Weil ich für jede Instanz eine gemeinsame Basis habe und die UUID mit einer Basis verketten müsste. Danke noch einmal!
Nikola
22
@nik: Verwenden Sie die Streaming-Unterstützung - es gibt ein stringstreamBeispiel. Oder lassen boost::lexical_cast<std::string>(uuid)Sie das für Sie tun.
Georg Fritzsche
15
Was die doppelten Klammern betrifft: Die erste erstellt eine Instanz von random_generator, die zweite verwendet operator()diese Instanz. Sie sollten den Generator speichern und ihn aufrufen operator(), wenn Sie mehr als eine UUID generieren möchten:random_generator rg; uuid ui = rg();
Georg Fritzsche
34
@ Nikola: Verwenden Sie boost :: uuids :: to_string (uuid) zum Stringifizieren von Uuids
King
2
@GeorgFritzsche Zusammen sind die genaue Zeit und die individuelle Netzwerkadresse der Maschine eindeutig. Ich denke daher, es könnte ein guter Schlüssel für die Hash-Funktion sein. Ich brauche die klaren Werte später nicht mehr. Aber deine Idee hat mir eine Idee gebracht. Es kann sinnvoll sein, Zeit und Netzwerkadresse als Startwert für den Zufallszahlengenerator oder so zu verwenden.
Danijar
34

Die Antwort von Georg Fritzsche ist in Ordnung, aber vielleicht etwas irreführend. Sie sollten den Generator wiederverwenden, wenn Sie mehr als eine UUID benötigen. Vielleicht ist es so klarer:

#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
quelle
1
Warum sollten Sie die Generatoren wiederverwenden? Ist dies eine Leistungsoptimierung oder ein Sicherheitstipp?
Fred
5
Es wäre keine sehr gute universell eindeutige ID, wenn die Verwendung eines neuen Generators Probleme mit der Eindeutigkeit verursachen würde.
Xaxxon
@xaxxon Haben Sie Unterlagen zum Eindeutigkeitsproblem beim Erstellen eines neuen Generators?
Saneesh Kumar
1
@Saneeshkumar Es ist aus einem bestimmten Grund eine "universell eindeutige Kennung", keine "eindeutige Kennung dieses Generators".
Xaxxon
1
Lernen Sie von mir und lassen Sie Generatoren lokal fädeln. Sie sind sehr teuer zu säen
James