Esempio di generazione di UUID utilizzando Boost in C ++


94

Voglio generare solo UUID casuali, poiché è importante che le istanze nel mio programma abbiano identificatori univoci. Ho esaminato Boost UUID , ma non riesco a generare l'UUID perché non capisco quale classe e metodo utilizzare.

Apprezzerei se qualcuno potesse darmi qualche esempio su come raggiungere questo obiettivo.

Risposte:


164

Un esempio di base:

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

Output di esempio:

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


4
E come lo assegneresti a una stringa? Perché ho una base comune per ogni istanza e avrei bisogno di concatenare l'UUID a una base. Grazie ancora!
Nikola

22
@nik: usa il supporto per lo streaming - c'è un stringstreamesempio. O lascia boost::lexical_cast<std::string>(uuid)che lo faccia per te.
Georg Fritzsche

15
Per quanto riguarda le doppie parentesi: la prima costruisce un'istanza di random_generator, la seconda usa operator()su quell'istanza. Dovresti salvare il generatore e chiamarlo operator()se vuoi generare più di un uuid:random_generator rg; uuid ui = rg();
Georg Fritzsche

34
@Nikola: usa boost :: uuids :: to_string (uuid) per stringere gli uuid
Re

2
@GeorgFritzsche Insieme, l'ora esatta e l'indirizzo di rete individuale della macchina sono unici. Ho pensato quindi che potrebbe essere una buona chiave per la funzione hash. Non ho bisogno di valori chiari in seguito. Ma la tua idea mi ha portato un'idea. Potrebbe essere utile utilizzare l'ora e l'indirizzo di rete come seme per il generatore di numeri casuali o giù di lì.
danijar

34

La risposta di Georg Fritzsche è ok ma forse un po 'fuorviante. Dovresti riutilizzare il generatore se hai bisogno di più di un uuid. Forse è più chiaro in questo modo:

#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
Perché dovresti riutilizzare i generatori? È un'ottimizzazione delle prestazioni o un suggerimento per la sicurezza?
Fred

5
Non sarebbe un ottimo ID universalmente univoco se l'utilizzo di un nuovo generatore causasse problemi di unicità.
xaxxon

@xaxxon Hai della documentazione relativa al problema di unicità durante la creazione di un nuovo generatore.
Saneesh kumar,

1
@Saneeshkumar È un "identificatore univoco universalmente" non un "identificatore univoco di questo generatore" per una ragione.
xaxxon

1
Impara da me e crea thread di generatori locali. Sono molto costosi da seminare
James il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.