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.

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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.