Contoh pembuatan UUID menggunakan Boost di C ++

94

Saya ingin membuat UUID acak, karena sangat penting untuk instance dalam program saya untuk memiliki pengenal unik. Saya melihat ke Boost UUID , tetapi saya tidak dapat membuat UUID karena saya tidak mengerti kelas dan metode mana yang akan digunakan.

Saya akan sangat menghargai jika seseorang dapat memberi saya contoh bagaimana mencapai ini.

Nikola
sumber

Jawaban:

165

Contoh dasar:

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

Contoh keluaran:

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

Georg Fritzsche
sumber
4
Dan bagaimana Anda menetapkannya ke string? Karena saya memiliki basis yang sama untuk setiap contoh dan saya perlu menggabungkan UUID ke basis. Terima kasih lagi!
Nikola
22
@nik: Gunakan dukungan streaming - ada stringstreamcontohnya. Atau biarkan boost::lexical_cast<std::string>(uuid)lakukan itu untukmu.
Georg Fritzsche
15
Adapun tanda kurung ganda: Yang pertama membangun sebuah instance random_generator, yang kedua menggunakan operator()instance itu. Anda harus menyimpan generator dan memanggilnya operator()jika Anda ingin menghasilkan lebih dari satu uuid:random_generator rg; uuid ui = rg();
Georg Fritzsche
34
@ Nikola: gunakan boost :: uuids :: to_string (uuid) untuk merangkai uuids
Raja
2
@GeorgFritzsche Bersama-sama, waktu yang tepat dan alamat jaringan individu mesin secara unik. Saya pikir karena itu mungkin kunci yang bagus untuk fungsi hash. Saya tidak butuh nilai yang jelas nanti. Tapi ide Anda memberi saya ide. Mungkin bagus untuk menggunakan waktu dan alamat jaringan sebagai seed untuk generator nomor acak atau lebih.
danijar
34

Jawaban dari Georg Fritzsche ok tapi mungkin agak menyesatkan. Anda harus menggunakan kembali generator jika Anda membutuhkan lebih dari satu uuid. Mungkin lebih jelas seperti ini:

#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
sumber
1
Mengapa Anda harus menggunakan kembali generator? Apakah ini tip pengoptimalan kinerja atau keamanan?
Fred
5
Ini tidak akan menjadi ID unik universal yang sangat baik jika menggunakan generator baru menyebabkan masalah keunikan.
xaxxon
@xaxxon Apakah Anda memiliki dokumentasi tentang masalah keunikan saat membuat generator baru.
Saneesh kumar
2
@Saneeshkumar Ini adalah "pengenal unik universal" bukan "pengenal unik generator ini" karena suatu alasan.
xaxxon
1
Belajar dari saya dan buat untaian generator menjadi lokal. Mereka sangat mahal untuk benih
Yakobus