プラットフォーム固有のツールに依存せずに、C++でプログラムでGUIDまたはUUIDを生成する最良の方法は何ですか?シミュレーションでオブジェクトの一意の識別子を作成しようとしていますが、プロジェクトはクロスプラットフォームであるため、Microsoftの実装について。
ノート:
Boostを使用する余裕がある場合、 [〜#〜] uuid [〜#〜] ライブラリがあり、トリックを行う必要があります。使い方は非常に簡単です-ドキュメントと この回答 を確認してください。
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;
}
Boostを使用する余裕がない場合は、各オペレーティングシステムのネイティブguid実装のラッパーとして機能する、最小限のライブラリが実装されています。 Windows(CoCreateGuid
を使用)、Linux(libuuid
を使用)、MacOS(CFUUID
を使用)、iOS(CFUUID
を使用)、およびAndroid(JNI呼び出しを使用してJava.util.UUID
)。 guid生成関数の実装はシステムごとに異なりますが、比較、文字列化、および解析のための単一の汎用実装があります。
MIT GitHubでライセンスされており、利用可能です:
ターゲットプラットフォームに存在するguid/uuidを使用するのが最適です。それを正しくするのは難しいです(買い物に行きましょう;))。
異なるが適切に実行された実装の任意の2つの識別子が衝突する確率は、この宇宙の存続期間に発生する合理的な可能性をはるかに超えるはずです。
GUIDジェネレーターは通常、マシンのハードウェア特性、通常はMACアドレスやIPなどに依存します。完全にプラットフォームに依存しない唯一の方法は、何らかの種類の [ 〜#〜] prng [〜#〜] 手動でシードされるか、何らかのタイムソースからシードされます。これは通常、世界中の誰も同じ番号を生成しないことが保証されるという意味で、真のグローバル一意識別子を生成しません。