Die Boost C++ Bibliotheken

Kapitel 65. Boost.Uuid

Die Bibliothek Boost.Uuid bietet Generatoren an, die UUIDs erzeugen können. Dabei handelt es sich um IDs, die weltweit eindeutig sind, ohne dass eine zentrale koordinierende Instanz notwendig ist. Es gibt also zum Beispiel keine Datenbank, die weltweit alle UUIDs speichert, um sicherzustellen, dass Sie eine neue noch nicht benutzte ID erhalten.

UUIDs werden in dezentral entwickelten Systemen verwendet, in denen Komponenten eindeutig identifiziert werden müssen. Zum Beispiel verwendet die von Microsoft entwickelte COM-Technologie UUIDs, um Schnittstellen zu identifizieren. Entwickeln Microsoft oder andere neue COM-Schnittstellen, können diesen schnell und einfach eindeutige IDs zugewiesen werden.

Bei UUIDs handelt es sich um 128-Bit-Zahlen. Es gibt verschiedene Möglichkeiten sicherzustellen, dass generierte UUIDs weltweit eindeutig sind. So kann beispielsweise die Netzwerkadresse eines Computers bei der Generierung einbezogen werden. Die von Boost.Uuid verwendeten Generatoren basieren auf einem Zufallsmechanismus, um zu verhindern, dass UUIDs Daten enthalten, die verraten, auf welchem Computer sie erzeugt wurden.

Alle von Boost.UUID angebotenen Klassen und Funktionen sind im Namensraum boost::uuids definiert. Es gibt jedoch keine Master-Headerdatei, die Sie einbinden können, um Zugriff auf alle Klassen und Funktionen von Boost.Uuid zu erhalten.

Beispiel 65.1. Zufällige UUIDs generieren mit boost::uuids::random_generator
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <iostream>

using namespace boost::uuids;

int main()
{
  random_generator gen;
  uuid id = gen();
  std::cout << id << '\n';
}

Im Beispiel 65.1 wird eine zufällige UUID generiert. Dazu wird auf die Klasse boost::uuids::random_generator zugegriffen. Um diesen Generator verwenden zu können, muss die Headerdatei boost/uuid/random_generator.hpp eingebunden werden. Über die im Beispiel 65.1 verwendete Headerdatei boost/uuid/uuid_generators.hpp kann auf alle von Boost.Uuid angebotenen Generatoren zugegriffen werden.

boost::uuids::random_generator wird wie die Generatoren aus der C++11-Standardbibliothek oder aus Boost.Random verwendet. Die Klasse überlädt den Operator operator(), auf den Sie zugreifen, um eine neue zufällige UUID zu erzeugen.

UUIDs haben den Typ boost::uuids::uuid. Es handelt sich hierbei um eine POD-Struktur – auf Englisch plain old data. Sie können Objekte vom Typ boost::uuids::uuid nicht ohne Generator initialisieren. Dafür handelt es sich um einen schlanken Typ, der im Speicher genau 128 Bits belegt. boost::uuids::uuid ist in der Headerdatei boost/uuid/uuid.hpp definiert, die deswegen im Beispiel 65.1 eingebunden wird.

Ein Objekt vom Typ boost::uuids::uuid kann direkt auf die Standardausgabe ausgegeben werden. Dazu muss jedoch die Headerdatei boost/uuid/uuid_io.hpp eingebunden werden. In dieser Headerdatei befinden sich die überladenen Operatoren, damit Objekte vom Typ boost::uuids::uuid an Streams übergeben werden können.

Wenn Sie Beispiel 65.1 ausführen, wird Ihnen zum Beispiel 0cb6f61f-be68-5afc-8686-c52e3fc7a50d ausgegeben. Die Einteilung in Blöcke, die mit Bindestrichen voneinander getrennt sind, ist die bevorzugte Darstellung von UUIDs.

Beispiel 65.2. Methoden von boost::uuids::uuid
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <iostream>

using namespace boost::uuids;

int main()
{
  random_generator gen;
  uuid id = gen();
  std::cout << id.size() << '\n';
  std::cout << std::boolalpha << id.is_nil() << '\n';
  std::cout << id.variant() << '\n';
  std::cout << id.version() << '\n';
}

boost::uuids::uuid bietet nur wenige Methoden an, von denen Ihnen einige im Beispiel 65.2 vorgestellt werden. size() gibt die Größe einer UUID in Bytes zurück. Da eine UUID per Definition 128 Bit groß ist, gibt size() immer 16 zurück. is_nil() gibt true zurück, wenn es sich bei einer UUID um eine Null-UUID handelt. Die Null-UUID ist 00000000-0000-0000-0000-000000000000. variant() und version() geben an, um welche Variante es sich bei einer UUID handelt und mit welchem Verfahren sie generiert wurde. Für Beispiel 65.2 gibt variant() 1 zurück, was bedeutet, dass sich die UUID nach der RFC-Spezifikation 4122 richtet. version() gibt 4 zurück. Das bedeutet, dass die UUID von einem Zufallsgenerator erzeugt wurde.

boost::uuids::uuid bietet außerdem Methoden wie begin(), end() und swap() an.

Beispiel 65.3. Generatoren von Boost.Uuid
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <iostream>

using namespace boost::uuids;

int main()
{
  nil_generator nil_gen;
  uuid id = nil_gen();
  std::cout << std::boolalpha << id.is_nil() << '\n';

  string_generator string_gen;
  id = string_gen("CF77C981-F61B-7817-10FF-D916FCC3EAA4");
  std::cout << id.variant() << '\n';

  name_generator name_gen(id);
  std::cout << name_gen("theboostcpplibraries.com") << '\n';
}

Im Beispiel 65.3 sehen Sie weitere von Boost.Uuid angebotene Generatoren. Mit nil_generator kann eine Null-UUID generiert werden. Nur für eine Null-UUID gibt is_nil() true zurück.

string_generator wird verwendet, wenn Sie bereits eine UUID haben und sie in Ihrem Programm verwenden wollen. So können Sie zum Beispiel UUIDs auf http://www.uuidgenerator.net/ generieren. Für die im Beispiel verwendete UUID gibt variant() 0 zurück, was bedeutet, dass die UUID dem abwärtskompatiblen Standard NCS entspricht. Die Klasse name_generator wiederum wird verwendet, um UUIDs in Namensräumen zu generieren.

Achten Sie auf die Schreibweise von UUIDs, wenn Sie die Klasse string_generator verwenden. Die Bindestriche müssen an den richtigen Stellen gesetzt sein. Alternativ können Sie UUIDs ohne Bindestriche angeben. Groß- und Kleinschreibung spielt keine Rolle.

Beispiel 65.4. Einfache Umwandlung in Strings
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>

using namespace boost::uuids;

int main()
{
  random_generator gen;
  uuid id = gen();

  std::string s = to_string(id);
  std::cout << s << '\n';

  std::cout << boost::lexical_cast<std::string>(id) << '\n';
}

Boost.Uuid bietet wie im Beispiel 65.4 zu sehen freistehende Funktionen wie boost::uuids::to_string() und boost::uuids::to_wstring() an, um UUIDs ohne den Umweg über Streams in einen String umwandeln zu können. Es ist außerdem möglich, UUIDs mit boost::lexical_cast() in einen String umzuwandeln.