Приклад генерації UUID за допомогою Boost у C ++


94

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

Буду вдячний, якщо хтось зможе навести мені будь-який приклад, як цього досягти.

Відповіді:


164

Основний приклад:

#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 у базу. Знову дякую!
Нікола

22
@nik: Скористайтеся підтримкою потокового передавання - є stringstreamприклад. Або нехай boost::lexical_cast<std::string>(uuid)зробить це за вас.
Georg Fritzsche

15
Що стосується подвійних парантезів: перший створює екземпляр random_generator, а другий використовує operator()цей екземпляр. Вам слід зберегти генератор і викликати operator()його, якщо ви хочете згенерувати більше одного uuid:random_generator rg; uuid ui = rg();
Georg Fritzsche

34
@Nikola: використовуйте boost :: uuids :: to_string (uuid) для розтягування uuids
Кінг

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
Чому слід повторно використовувати генератори? Це оптимізація продуктивності чи підказка щодо безпеки?
Fred

5
Це не буде дуже хорошим універсальним унікальним ідентифікатором, якщо використання нового генератора спричинить проблеми унікальності.
xaxxon,

@xaxxon Чи є у вас документація щодо проблеми унікальності при створенні нового генератора?
Saneesh kumar

1
@Saneeshkumar Це "універсальний унікальний ідентифікатор", а не "унікальний ідентифікатор цього генератора" з певної причини.
xaxxon

1
Вчіться у мене та робіть локальні потоки генераторів. Їх дуже дорого висаджувати
Джеймс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.