2

私はhttp://www.ietf.org/rfc/rfc4122.txtで UUID RFC を読んでおり、pythonuuidモジュールを使用して実験しています。説明を簡単にするために、仕様から引用した UUID 図を次に示します。

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          time_low                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       time_mid                |         time_hi_and_version   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         node (2-5)                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

仕様を読んだところによると、最小のタイプ 1 UUID には time_low、time_mid、clk_seq_hi_res、clk_seq_low、およびノー​​ドをすべて 0 に設定する必要があり、time_hi_and_version にはビット 15 を 1 に設定する必要があります。最大のタイプ 1 UUID には time_low を設定する必要があります。 、time_mid、clk_seq_hi_res、clk_seq_low、およびノー​​ドはすべて 1 に設定され、time_hi_and_version はビット 12、13、および 14 を除いてすべて 1 に設定されます。

ただし、Python でこれらを生成しようとすると失敗します。

>>> u = uuid.UUID("{00000000-0000-0000-0001-00000000}")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.4/Frameworks/Python.framework/Versions/2.7/lib/python2.7/uuid.py", line 134, in __init__
    raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string

>>> u = uuid.UUID("{ffffffff-ffff-ffff-fff1-ffffffff}")                                                                                                                                                          
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.4/Frameworks/Python.framework/Versions/2.7/lib/python2.7/uuid.py", line 134, in __init__
    raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string

仕様を間違って読んでいると思いますが、途方に暮れています。

4

1 に答える 1

1

問題は特定の値にあるのではなく、十分な値がないことです。

16 バイトではなく 14 バイト分のデータしか提供していません。それが不満の原因です。

UUIDタイプ 1 UUID の要件をまったくチェックしていません。その場合、要件が異なる他の UUID タイプでは機能しません。

これを試して:

In [58]: uuid.UUID("{00000000-0000-0000-0000-000000000000}")
Out[58]: UUID('00000000-0000-0000-0000-000000000000')
In [59]: uuid.UUID('{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}')
Out[59]: UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')

その間、明らかにバージョンとバリアントを混同し、エンディアンを逆にしました。それでは、最初からやり直しましょう。

仕様を読んだところによると、最小のタイプ 1 UUID には、time_low、time_mid、clk_seq_hi_res、clk_seq_low、およびノー​​ドがすべて 0 に設定されている必要があります。

clk_seq_hi_resは の略語でclock_sequence_hi_and_reservedあり、セクション 4.1.2 で「バリアントと多重化されたクロック シーケンスの高フィールド」と定義されています。バリアントは 4.1.1 で定義されており、最上位 2 ビットをそれぞれ 1 と 0 に設定する「このドキュメントで指定されたバリアント」が必要です。したがって、このフィールドをすべて 0 またはすべて 1 にすることはできません。これは最小ではなく上位ビットであるため、(8, 9, a, b)下位ニブルは(1, 5, 9, d)

、および time_hi_and_version のビット 15 を 1 に設定する必要があります。

いいえ、バージョン番号はタイムスタンプの最上位 4 ビットとして 4.1.3 で説明されており、バージョン 1 は 0-0-0-1 として定義されています。したがって、ビット 15 を 0 に設定し、14 と 13 も同様に設定し、ビット 12 を 1 に設定する必要があります。これは、オクテット 7 の下位ニブルではなく、オクテット 6 の上位ニブル全体を 1 にする必要があることを意味します。

そう:

00000000-0000-1000-8000-000000000000
ffffffff-ffff-1fff-bfff-ffffffffffff

これらのタイムスタンプで表される日付は少しばかげていることに注意してください。前者は 1582 年 10 月 15 日の真夜中、後者は 53 世紀のものです。

また、すべて 0 のノードはすべて 0 のグローバル ユニキャスト MAC アドレスであり、それが有効な IEEE-802 アドレスかどうかはわかりません。マルチキャスト ビットを設定すると乱数の使用が明示的に許可されるため、すべて 1 のノードは問題ありません。


* さまざまなBBC のドキュメンタリー関連する教科書が説明しているように、49 世紀までに、人類はタイム トラベルを行うようになり、タイム スタンプ技術をすべて変更せざるを得なくなります。

于 2013-06-02T05:02:06.633 に答える