Przykład generowania UUID przy użyciu Boost w C ++

96

Chcę generować tylko losowe identyfikatory UUID, ponieważ ważne jest, aby instancje w moim programie miały unikalne identyfikatory. Zajrzałem do Boost UUID , ale nie mogę wygenerować UUID, ponieważ nie rozumiem, której klasy i metody użyć.

Byłbym wdzięczny, gdyby ktoś dał mi przykład, jak to osiągnąć.

Nikola
źródło

Odpowiedzi:

167

Podstawowy przykład:

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

Przykładowe dane wyjściowe:

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

Georg Fritzsche
źródło
4
A jak przypisałbyś to do łańcucha? Ponieważ mam wspólną bazę dla każdej instancji i musiałbym połączyć UUID z bazą. Dzięki jeszcze raz!
Nikola,
22
@nik: Skorzystaj z obsługi przesyłania strumieniowego - jest stringstreamprzykład. Albo pozwól boost::lexical_cast<std::string>(uuid)zrobić to za Ciebie.
Georg Fritzsche,
16
Co do podwójnych parantez: pierwsza konstruuje instancję random_generator, druga używa operator()na tej instancji. Powinieneś zapisać generator i wywołać operator()go, jeśli chcesz wygenerować więcej niż jeden uuid:random_generator rg; uuid ui = rg();
Georg Fritzsche.
36
@Nikola: użyj boost :: uuids :: to_string (uuid) do tworzenia uuidów
King
2
@GeorgFritzsche Razem dokładny czas i indywidualny adres sieciowy maszyny są niepowtarzalne. Pomyślałem, że może to być dobry klucz do funkcji skrótu. Nie potrzebuję później jasnych wartości. Ale twój pomysł przyniósł mi pomysł. Dobrze byłoby wykorzystać czas i adres sieciowy jako ziarno dla generatora liczb losowych.
danijar
36

Odpowiedź Georga Fritzschego jest w porządku, ale może trochę myląca. Powinieneś ponownie użyć generatora, jeśli potrzebujesz więcej niż jednego płynu. Może to jest jaśniejsze w ten sposób:

#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
źródło
1
Dlaczego powinieneś ponownie używać generatorów? Czy jest to optymalizacja wydajności czy wskazówka dotycząca bezpieczeństwa?
Fred
5
Nie byłby to bardzo dobry uniwersalny unikalny identyfikator, gdyby użycie nowego generatora powodowało problemy z unikalnością.
xaxxon
@xaxxon Czy masz jakąś dokumentację dotyczącą problemu z unikalnością podczas tworzenia nowego generatora.
Saneesh kumar
2
@Saneeshkumar Nie bez powodu jest to „uniwersalny unikalny identyfikator”, a nie „unikalny identyfikator tego generatora”.
xaxxon
1
Ucz się ode mnie i twórz lokalne wątki generatorów. Są bardzo drogie w wysiewie
James,