0

非常に単純な質問です。

Microsoft GUID が生成されるとき、GUID のどの部分が固有と見なされますか? たとえば、次の GUID を使用します。

19C73070-400A-11E2-B017-3D05D2B0F3CE

GUID では、タイムスタンプ用に指定された 60 ビット、コンピューター識別子用に 48 ビット、14 ビットの一意性、および 6 ビットが固定されていることを知っています。これだけではどの順番かわかりません。

上記の GUID のどの部分を使用して一意にすることができますか? 重複不可能である必要はありませんが、それを識別するには十分です。

ありがとう。

4

3 に答える 3

3

おそらく6つの固定ビットを除いて、一意性のために128ビットすべてが必要です。異なるタイムスタンプに対して同じランダム部分が生成される可能性があり、バージョンを除いて、V1 GUID を生成するすべての人が V4 GUID と同じになる可能性があります。

GUID全体を使用するか、何も使用しないでください。より短いものが必要な場合は、乱数ジェネレーターとアプリケーション識別子を使用した他のオプションがある可能性があります。

推奨される読書: GUID はグローバルに一意ですが、GUID の部分文字列はそうではありません

于 2012-12-07T01:28:14.553 に答える
2

GUIDジェネレーターは変更される可能性があるため、その実装に依存しないでください。ここで行う正しいことは、ハッシュアルゴリズムを使用してGUIDの8バイトのハッシュを生成し、代わりにそれを使用することです。

于 2012-12-07T01:21:37.627 に答える
0

一意性は、公正な GUID 生成アルゴリズムを使用して、同じ GUID を再び取得する可能性から生じます。guid アルゴリズムは基本的に乱数生成器であり、選択肢の数は天文学的な数です。つまり、公平に生成された 2 つの guid 生成が同じ数になることはほとんどありません。

GUID は 128 ビットであるため、2^128 個の一意の GUID があります。64 ビット (8 バイト) しかない場合、選択肢は 2^64 しかありません。これははるかに小さい数値であり、64 ビットの数値をランダムに選択すると、別のランダムな選択と「衝突」する可能性がはるかに高くなります。

日付と時刻を分までの 4 バイト (smalldatetime) などの構造を指定すると、その 1 分間のレコードを一意に識別するための乱数用に 60 ビットが残ります。毎分 n 番目の新しいレコードの ID を (n-1)/2^60 番目に繰り返す可能性がある場合は、それを使用できます。(これらの 64 ビットすべてを ID として引き続き使用します) そうでない場合は、ビットを増やしてください!

さらに、GUID が有用であるために真にグローバルに一意である必要はないことに注意してください。何のためにあるのかという暗黙の情報も一意性の一部です。ファイルのアップロードを管理するためのレコードがデータベースにあり、その同じ GUID がプラハのプログラマーによって ActiveX プラグインを定義するために使用されている場合 - 一部のコードがレコード ID を使用して ActiveX をロードする時間がないため、まったく問題はありません。 、プラグインをロードしようとしていたときにブラウザが誤ってレコードをロードすることもありません! 数のコンテキストは、数自体の重要な部分です。

ただし、常に接続されているとは限らない 2 つ以上のシステム (オフラインまたはピアツーピア クライアント、または複数のサーバー) 間で新しい ID を生成する必要がない限り、中央機関によって管理され、代わりに連続的に増加する long を使用します。

于 2012-12-07T01:44:43.340 に答える