C ++ 'da Boost kullanarak UUID oluşturma örneği


96

Programımdaki örneklerin benzersiz tanımlayıcılara sahip olması önemli olduğundan, yalnızca rastgele UUID'ler oluşturmak istiyorum. Boost UUID'ye baktım , ancak hangi sınıf ve yöntemi kullanacağımı anlamadığım için UUID'yi oluşturmayı başaramıyorum.

Biri bana bunun nasıl başarılacağına dair herhangi bir örnek verebilirse minnettar olurum.

Yanıtlar:


167

Temel bir örnek:

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

Örnek çıktı:

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


4
Ve bunu bir dizeye nasıl atarsınız? Çünkü her örnek için ortak bir tabana sahibim ve UUID'yi bir tabana birleştirmem gerekiyor. Tekrar teşekkürler!
Nikola

22
@nik: Akış desteğini kullanın - bir stringstreamörnek var. Veya bunu boost::lexical_cast<std::string>(uuid)sizin için yapalım .
Georg Fritzsche

16
Çift parantezlere gelince: Birincisi bir örneğini oluşturur random_generator, ikincisi operator()bu örneği kullanır . operator()Birden fazla uuid oluşturmak istiyorsanız , jeneratörü kaydetmeli ve onu aramalısınız :random_generator rg; uuid ui = rg();
Georg Fritzsche

36
@Nikola: uuids'i dizmek için boost :: uuids :: to_string (uuid) kullanın
King

2
@GeorgFritzsche Birlikte, tam zaman ve makinenin bireysel ağ adresi benzersizdir. Bu nedenle hash işlevi için iyi bir anahtar olabilir. Net değerlere daha sonra ihtiyacım yok. Ama fikriniz bana bir fikir getirdi. Rastgele sayı üreteci için çekirdek olarak zaman ve ağ adresini kullanmak iyi olabilir.
danijar

36

Georg Fritzsche'nin cevabı tamam ama belki biraz yanıltıcı. Birden fazla uuid'e ihtiyacınız varsa jeneratörü yeniden kullanmalısınız. Belki bu şekilde daha nettir:

#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
Jeneratörleri neden yeniden kullanmalısınız? Bu bir performans optimizasyonu mu yoksa bir güvenlik ipucu mu?
Fred

5
Yeni bir jeneratör kullanmak benzersizlik sorunlarına neden olsaydı, evrensel olarak benzersiz bir kimlik olmazdı.
xaxxon

@xaxxon Yeni oluşturucu oluştururken benzersizlik sorunuyla ilgili herhangi bir belgeniz var mı?
Saneesh kumar

2
@Saneeshkumar Bu "evrensel olarak benzersiz bir tanımlayıcı", bir nedenle "bu jeneratörün benzersiz tanımlayıcısı" değil.
xaxxon

1
Benden öğrenin ve jeneratörleri yerel olarak işleyin. Tohumlamak çok pahalıdır
James
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.