web-dev-qa-db-ja.com

プラットフォームに依存しないGUID C ++での生成?

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

ノート:

  • これはシミュレータ用であるため、暗号のランダム性は実際には必要ありません。
  • これが32ビットの数値である場合に最適です。
54
Moses Schwartz

Boostを使用する余裕がある場合、 [〜#〜] uuid [〜#〜] ライブラリがあり、トリックを行う必要があります。使い方は非常に簡単です-ドキュメントと この回答 を確認してください。

45
Anonymous

linuxの場合:man uuid

win: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;
}
40
ubik

Boostを使用する余裕がない場合は、各オペレーティングシステムのネイティブguid実装のラッパーとして機能する、最小限のライブラリが実装されています。 Windows(CoCreateGuidを使用)、Linux(libuuidを使用)、MacOS(CFUUIDを使用)、iOS(CFUUIDを使用)、およびAndroid(JNI呼び出しを使用してJava.util.UUID)。 guid生成関数の実装はシステムごとに異なりますが、比較、文字列化、および解析のための単一の汎用実装があります。

MIT GitHubでライセンスされており、利用可能です:

https://github.com/graeme-hill/crossguid

14
Graeme Hill

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

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

2
ShuggyCoUk

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

1
shoosh