2

Boostuuidを使用してセッションIDを生成しています。

std::string SessionGenerator::generate()
{
    boost::uuids::uuid id = m_rgen();
    m_ss.clear();
    m_ss.str("");
    m_ss << id;

    return m_ss.str();
}

重複することはないと想定しても安全ですか、それともアクティブなセッションに対してチェックを行う必要がありますか?

ありがとう

4

3 に答える 3

8

まあ、それは異なります。

定義されたメカニズムの1つによってUUIDが生成される場合、それらは一意であることが保証されているか、他のすべての生成されたUUIDとは異なります(つまり、これまでに生成されたことがなく、再度生成されることもありません)。一意である(メカニズムによって異なります)。

これは、使用しているジェネレーターに問題がある可能性があることを意味します。彼らは、ITU-T仕様を使用していると言っています。

ドキュメントの7ページに移動しましょう。時間を使用していて、次のことを想定できる場合:

  • システム時刻は変更されません。
  • マシンの識別に使用されるノードIDは変更されません。

次に、少なくとも次のことを主張できます。

「UUIDは、生成された他のすべてのUUIDとは異なります」。これは、時間が流れ、粒度が100nsであるためです。

生成されたUUIDを他のマシンと共有する必要がある場合、衝突が発生する可能性があります。そうしないと、時間が変更されます(多くの国では、年に2回、時間調整があることを忘れないでください)。そのため、クロックシーケンスフィールドがあります。さらに、それはかなり小さいので、この場合、あなたはそれを主張することになります:

「UUIDは一意である可能性が非常に高いです。」

これの代わりに乱数ジェネレーターを使用している場合は、次のことだけをアサートできます。

「UUIDは一意である可能性が非常に高いです。」乱数ジェネレーターの要件は一意の数値を生成することではないためです(ただし、優れた乱数ジェネレーターを使用すると、非常に可能性が非常に高くなります

したがって、通常の状態(たとえば、あるコンピューターから別のコンピューターに1つのネットワークカードを移動せず、時間を過去に戻す場合)では、それらは(時間を使用して)一意であると見なすことができると思います。乱数ジェネレーターを使用している場合、それらが一意であるとは想定できませんが、一意である可能性が非常に高くなります(衝突の確率について...まあ...それが優れた乱数ジェネレーターで発生する場合は、次の流星群の家)。

参照
http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspxhttp://en.wikipedia.org/wiki/Birthday_attack
_

于 2012-06-08T15:40:12.020 に答える
1

単一のジェネレーターがすべてのuuidを生成している場合、それらは一意であることが保証されます。免責事項、私はこれを検証するためのコードやドキュメントを見ていませんが、それは設計上の目標です。

uuidにはさまざまなクラスがあり、その一部には、それが実行されているマシンまたは環境からのビットが含まれています。これらは、他の場所で生成されたIDとの衝突の可能性を減らします。

最悪の場合でも、RAMエラーが原因でIDを操作する可能性は、2つの同一のIDを生成するよりもはるかに高くなります。そして、誰もそれについて心配しません。

于 2012-06-08T15:40:53.940 に答える
0

いいえ、重複することはないと想定することはできません
しかし、重複を取得する可能性については、ウィキペディアを参照してください。
またboost、ITU仕様に準拠しているため、重複することはないと考えられます。

于 2012-06-08T15:41:47.763 に答える