Exemplo de geração de UUID usando Boost em C ++

94

Quero gerar UUIDs aleatórios, pois é importante que as instâncias do meu programa tenham identificadores exclusivos. Eu olhei para Boost UUID , mas não consigo gerar o UUID porque não entendo qual classe e método usar.

Eu apreciaria se alguém pudesse me dar algum exemplo de como fazer isso.

Nikola
fonte

Respostas:

164

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

Exemplo de saída:

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

Georg Fritzsche
fonte
4
E como você atribui isso a uma string? Porque tenho uma base comum para cada instância e precisaria concatenar o UUID a uma base. Obrigado novamente!
Nikola
22
@nik: Use o suporte de streaming - há um stringstreamexemplo. Ou deixe boost::lexical_cast<std::string>(uuid)fazer isso por você.
Georg Fritzsche
15
Quanto aos parênteses duplos: o primeiro constrói uma instância de random_generator, o segundo usa operator()nessa instância. Você deve salvar o gerador e chamá operator()-lo se quiser gerar mais de um uuid:random_generator rg; uuid ui = rg();
Georg Fritzsche
34
@Nikola: use boost :: uuids :: to_string (uuid) para restringir uuids
Rei
2
@GeorgFritzsche Juntos, a hora exata e o endereço de rede individual da máquina são únicos. Eu pensei, portanto, que poderia ser uma boa chave para a função hash. Não preciso dos valores claros mais tarde. Mas sua ideia me trouxe uma ideia. Pode ser bom usar o tempo e o endereço de rede como semente para o gerador de números aleatórios ou algo assim.
danijar
34

A resposta de Georg Fritzsche é ok, mas talvez um pouco enganosa. Você deve reutilizar o gerador se precisar de mais de um uuid. Talvez seja mais claro desta forma:

#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
fonte
1
Por que você deve reutilizar os geradores? Isso é uma otimização de desempenho ou uma dica de segurança?
Fred
5
Não seria um ID universalmente único muito bom se o uso de um novo gerador causasse problemas de exclusividade.
xaxxon
@xaxxon Você tem alguma documentação sobre o problema de exclusividade ao criar um novo gerador.
Saneesh kumar
1
@Saneeshkumar É um "identificador exclusivo universal" e não um "identificador exclusivo deste gerador" por uma razão.
xaxxon
1
Aprenda comigo e faça geradores thread local. Eles são muito caros para semear
James,