C ++でBoostを使用したUUID生成の例


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、2番目はoperator()そのインスタンスで使用します。あなたは、発電機とコール保存する必要がありますoperator():あなたは複数のUUIDを生成したい場合は、それにはrandom_generator rg; uuid ui = rg();
ゲオルクフリッチェ

34
@Nikola:利用ブースト::のUUID :: UUIDを文字列化するために(UUID)をTO_STRING
キング

2
@GeorgFritzsche一緒に、正確な時間とマシンの個々のネットワークアドレスは一意です。ですから、それはハッシュ関数の良い鍵かもしれません。後で明確な値は必要ありません。しかし、あなたのアイデアは私にアイデアをもたらしました。乱数ジェネレータなどのシードとして、時間とネットワークアドレスを使用することをお勧めします。
ダニジャー2013

34

Georg Fritzscheの答えは問題ありませんが、少し誤解を招く可能性があります。複数の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
新しいジェネレーターを使用すると一意性の問題が発生する場合、これは非常に優れた普遍的に一意のIDではありません。
xaxxon

@xaxxon新しいジェネレータを作成するときの一意性の問題に関するドキュメントはありますか。
Saneesh kumar 2016

1
@Saneeshkumarこれは「普遍的に一意の識別子」であり、理由により「このジェネレータの一意の識別子」ではありません。
xaxxon 2016

1
私から学び、ジェネレーターをローカルスレッドにします。種
James
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.