3

ある勤勉な日、通常の .NET の方法で生成したGUIDの 3 番目のブロックの先頭にGuid.NewGuid()同じ番号があることに気付きました。4

efeafa5f-fe21-4ab4-ba82-b9eefd5fa225
480b64d0-6762-4afe-8496-ac7cf3292898
397579c2-a4f4-4611-9fda-16e9c1e52d6a
...

1秒間に1回、10個ほど画面に表示されていました。5 番目の GUID の直後にあるこのパターンに注目しました。最後に、最後のものには同じ 4 つのビットがあり、私は幸運な人だと判断しました。私は家に帰って、私のような特別な人のために全世界が開かれていると感じました. 翌週、私は新しい仕事を見つけ、部屋を掃除し、両親に電話をかけました。

しかし、今日また同じパターンに直面しました。千回。そして、私はもう選ばれし者を感じません。

私はそれをグーグルで検索しましたが、今ではUUIDversionと、4つの予約ビットと2つの予約ビットを持つ標準フォーマットについて知っていvariantます。

実験するスニペットを次に示します。

static void Main(string[] args)
{
    while (true)
    {
        var g = Guid.NewGuid();
        Console.WriteLine(BitConverter.ToString(g.ToByteArray()));
        Console.WriteLine(g.ToString());
        Console.ReadLine();
    }
}

しかし、まだ理解できないことが 1 つあります (生きていく方法以外は)。なぜこれらの予約ビットが必要なのですか? それがどのように害を及ぼす可能性があるかはわかります-内部実装の詳細を公開し、衝突が増え(まだ心配する必要はありませんが、いつか...)、自殺が増えます-しかし、何の利益も見られません. 何か見つけるのを手伝ってくれませんか?

GUID 生成アルゴリズムの内部

4

1 に答える 1

5

アルゴリズムを更新すると、その数を変更できるようになります。そうしないと、2 つの異なるアルゴリズムが異なる理由でまったく同じ UUID を生成し、衝突が発生する可能性があります。バージョン識別子です。

たとえば、考案された単純化された UUID 形式を考えてみましょう。

00000000-00000000
  time  -   ip

何らかの理由でその形式を次のように変更するとします。

00000000-00000000
   ip   -  time

これにより、IP 12.34.56.78 を持つマシンが時間 01234567 で最初の方法を使用して UUID を生成し、その後 IP 01.23.45.67 を持つ 2 番目のマシンが時間 12345678 で新しい方法を使用して UUID を生成すると、衝突が発生する可能性があります。ただし、バージョン識別子用にいくつかのビットを予約すると、衝突が発生する可能性はなくなります。

値 4 は、時間、MAC アドレス、pid、またはその他の種類の時間と空間の識別子の組み合わせを使用できる他の方法ではなく、ランダムに生成された UUID (したがって、非常に多くのビットが与えられる衝突のわずかな可能性に依存します) を具体的に参照します。一意性を保証します。

関連する仕様については、こちらを参照してください: https://www.rfc-editor.org/rfc/rfc4122#section-4.1.3

于 2015-01-10T17:04:22.847 に答える