59

プラットフォーム固有のツールに依存せずに C++ で GUID または UUID をプログラムで生成する最良の方法は何ですか? シミュレーションでオブジェクトの一意の識別子を作成しようとしていますが、プロジェクトがクロスプラットフォームであるため、Microsoft の実装に依存することはできません。

ノート:

  • これはシミュレータ用なので、暗号のランダム性はあまり必要ありません。
  • これが 32 ビットの数値であれば最高です。
4

6 に答える 6

48

Boost を使用する余裕がある場合は、そのトリックを実行するUUIDライブラリがあります。使い方はとても簡単です。ドキュメントとこの回答を確認してください。

于 2009-02-12T21:26:16.733 に答える
43

Linuxの場合:man uuid

勝利時:msdnのUUID構造とUuidCreate関数を確認してください

[編集]関数は次のように表示されます

extern "C"
{
#ifdef WIN32
#include <Rpc.h>
#else
#include <uuid/uuid.h>
#endif
}

std::string newUUID()
{
#ifdef WIN32
    UUID uuid;
    UuidCreate ( &uuid );

    unsigned char * str;
    UuidToStringA ( &uuid, &str );

    std::string s( ( char* ) str );

    RpcStringFreeA ( &str );
#else
    uuid_t uuid;
    uuid_generate_random ( uuid );
    char s[37];
    uuid_unparse ( uuid, s );
#endif
    return s;
}
于 2009-10-26T17:56:56.120 に答える
2

ターゲット プラットフォームに存在する guid/uuid をそのまま使用するのが最適です。それを正しく行うのは難しいです (買い物に行きましょう ;))。

異なるが適切に実行された実装からの任意の 2 つの識別子間の衝突の確率は、この宇宙の存続期間中に発生する合理的な可能性をはるかに超えているはずです。

于 2009-02-12T21:25:05.240 に答える
1

通常、GUID ジェネレーターはマシンのハードウェア特性 (通常は MAC アドレスや IP など) に依存します。完全にプラットフォームに依存せずにできる唯一のことは、手動でシードされた、または何らかのタイムソースからシードされたある種のPRNGを使用することです。これは通常、世界中の誰も同じ番号を生成しないことが保証されているという意味で、真のグローバル一意識別子を生成しません。

于 2009-02-12T21:24:48.220 に答える
-2

Web サービスを使用して GUID を取得するのが、風変わりな (?) 解決策の 1 つですが、特にネットワークが有効になっていない場合、これが C++ プログラムにとって適切な解決策になるとは思えません。

このオプションを追求することを選択した場合に役立つ URL は次のとおりです: http://www.hoskinson.net/GuidGenerator/default.asp

于 2009-02-12T21:36:30.313 に答える