Пример генерации UUID с использованием Boost в C ++

94

Я хочу сгенерировать только случайные UUID, так как для экземпляров в моей программе просто важно иметь уникальные идентификаторы. Я изучил Boost UUID , но мне не удалось сгенерировать UUID, потому что я не понимаю, какой класс и метод использовать.

Я был бы признателен, если бы кто-нибудь мог дать мне какой-либо пример того, как этого добиться.

Никола
источник

Ответы:

165

Базовый пример:

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

Пример вывода:

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

Георг Фриче
источник
4
А как бы вы присвоили его строке? Потому что у меня есть общая база для каждого экземпляра, и мне нужно было бы объединить UUID с базой. Еще раз спасибо!
Nikola
22
@nik: Воспользуйтесь поддержкой потоковой передачи - есть stringstreamпример. Или позвольте boost::lexical_cast<std::string>(uuid)сделать это за вас.
Георг Фриче
15
Что касается двойных скобок: первая создает экземпляр random_generator, вторая использует operator()в этом экземпляре. Вы должны сохранить генератор и вызвать operator()его, если вы хотите сгенерировать более одного uuid:random_generator rg; uuid ui = rg();
Георг Фриче
34
@Nikola: используйте boost :: uuids :: to_string (uuid) для преобразования uuid в строку
King
2
@GeorgFritzsche Вместе точное время и индивидуальный сетевой адрес машины уникальны. Я подумал, что это может быть хорошим ключом для хеш-функции. В дальнейшем мне не нужны четкие значения. Но ваша идея принесла мне идею. Было бы неплохо использовать время и сетевой адрес в качестве начального числа для генератора случайных чисел или около того.
danijar
34

Ответ Георга Фриче нормальный, но, возможно, он немного вводит в заблуждение. Вы должны повторно использовать генератор, если вам нужно более одного uuid. Может, так понятнее:

#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
Почему вы должны повторно использовать генераторы? Это оптимизация производительности или совет по безопасности?
Фред
5
Это не был бы очень хороший универсальный уникальный идентификатор, если бы использование нового генератора вызывало проблемы с уникальностью.
xaxxon
@xaxxon Есть ли у вас документация по проблеме уникальности при создании нового генератора.
Saneesh kumar
2
@Saneeshkumar Это «универсальный уникальный идентификатор», а не «уникальный идентификатор этого генератора» по какой-то причине.
xaxxon
1
Учитесь у меня и делайте потоки генераторов локальными. Их очень дорого сеять
Джеймс