0

バージョン1のTimeUUIDAが有効なバージョン1のTimeUUIDBを生成する関数increment(uuid)を実装するにはどうすればよいですか。

  1. B> A
  2. B>C>AであるCは存在しません

また、バージョン1のTimeUUIDAが有効なバージョン1のTimeUUIDBを生成するdecrement(uuid)についても同じです。ここで、

  1. B <A
  2. B<C<AであるCは存在しません
4

1 に答える 1

0

バージョン1のuuidシーケンスは、タイムスタンプフィールドとクロックシーケンスフィールドに表示されます。タイムスタンプは60ビットの日付スタンプ(100ナノ秒の時間増分、fwiwを表す)であり、クロックシーケンスは、特定のクロックサイクル中に生成されたuuidが一意であることを保証する14ビットのカウンターです。したがって、v1 uuidは、タイムスタンプが上位ビットで、クロックシーケンスが下位ビットである74ビットのシーケンス番号を持っていると考えることができます。したがって、UUIDを1つアトミックにインクリメントするには、必要なのは...

  1. タイムスタンプフィールドとクロックシーケンスフィールドを解析します
  2. クロックシーケンスを1つインクリメントします
  3. クロックシーケンスが>=2 ^^ 14の場合は、ゼロに設定し、タイムスタンプフィールドを1つインクリメントします。
  4. フィールドを元のUUIDに書き戻します。

ステップ#1と#4は、クロックシーケンスを含む2つのオクテットにもuuidバリアントが含まれているため、少し複雑であることに注意してください。したがって、14-だけを抽出/設定するには、ビット単位のジャグリングを少し行う必要があります。 clockseqのビット。

uuidをデクリメントするには、上記を繰り返します。ただし、手順2と3を除き、クロックシーケンスがゼロの場合は、2 ^^ 14-1に設定し、タイムスタンプを1つデクリメントします。

最後に、60ビットのタイムスタンプがオーバーフロー/アンダーフローした場合に何をしたいかを自分で決定する必要があります。タイムスタンプ0は、シェイクスピアが結婚した頃(1582 AD)にUUIDが生成されたことを意味し、タイムスタンプ2 ^^ 60-1は、5238 AD年にあなたの(great ^^ 150)孫によって生成されたことを意味します。 ..これはそれほど問題ではないと思います。

于 2012-10-19T19:02:59.593 に答える