Ejemplo de generación de UUID usando Boost en C ++

94

Quiero generar UUID aleatorios, ya que es importante que las instancias de mi programa tengan identificadores únicos. Miré el UUID de Boost , pero no puedo generar el UUID porque no entiendo qué clase y método usar.

Agradecería que alguien me pudiera dar algún ejemplo de cómo lograrlo.

Nikola
fuente

Respuestas:

164

Un ejemplo básico:

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

Salida de ejemplo:

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

Georg Fritzsche
fuente
4
¿Y cómo lo asignarías a una cadena? Porque tengo una base común para cada instancia y necesitaría concatenar UUID a una base. ¡Gracias de nuevo!
Nikola
22
@nik: Utilice el soporte de transmisión ; hay un stringstreamejemplo. O deja boost::lexical_cast<std::string>(uuid)que lo haga por ti.
Georg Fritzsche
15
En cuanto a las paréntesis dobles: la primera construye una instancia de random_generator, la segunda usa operator()en esa instancia. Debe guardar el generador e invocarlo operator()si desea generar más de un uuid:random_generator rg; uuid ui = rg();
Georg Fritzsche
34
@Nikola: use boost :: uuids :: to_string (uuid) para encadenar uuids
Rey
2
@GeorgFritzsche Juntos, la hora exacta y la dirección de red individual de la máquina es única. Por lo tanto, pensé que podría ser una buena clave para la función hash. No necesito los valores claros más adelante. Pero tu idea me ha traído una idea. Podría ser bueno usar la hora y la dirección de red como semilla para el generador de números aleatorios más o menos.
danijar
34

La respuesta de Georg Fritzsche está bien, pero quizás un poco engañosa. Debe reutilizar el generador si necesita más de un uuid. Quizás sea más claro de esta manera:

#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
fuente
1
¿Por qué debería reutilizar los generadores? ¿Es esto una optimización del rendimiento o un consejo de seguridad?
Fred
5
No sería una identificación única universal muy buena si el uso de un nuevo generador causara problemas de singularidad.
xaxxon
@xaxxon ¿Tiene alguna documentación sobre el problema de la unicidad al crear un nuevo generador?
Saneesh kumar
1
@Saneeshkumar Es un "identificador único universal" no un "identificador único de este generador" por una razón.
xaxxon
1
Aprende de mí y haz generadores de hilo local. Son muy caros de sembrar
James