For Development HEAD DRAFTSearch (procedure/syntax/module):

Next: , Previous: , Up: ライブラリモジュール - ユーティリティ   [Contents][Index]

12.56 rfc.uuid - UUID

Module: rfc.uuid

RFC4122で定義されたUUIDを実装しています。

UUIDバージョン1、4、6、7を生成する機能、及びUUIDの文字列表記をパーズしたり バイナリから文字列表記を生成する機能が提供されます。

Class: <uuid>

{rfc.uuid} UUIDクラスです。UUIDインスタンスは変更不可なオブジェクトです。

Function: uuid-value uuid

{rfc.uuid} UUID uuidの「生の」値を、16要素のu8vectorとして返します。 返されたベクタを変更してはいけません。

Function: uuid-version uuid

{rfc.uuid} uuidのバージョン番号を返します。

Variable: uuid-comparator

{rfc.uuid} UUID同士を比較したりハッシュ値を取れる比較器です。 比較器については基本的な比較器参照。

註: 二つのUUIDが等しいかどうかはequal?で検査できます。

Parameter: uuid-random-source

{rfc.uuid} UUIDを生成するのに乱数発生器を使います。 デフォルトでは、内部的に乱数源を作って乱数化したものを使いますが、 このパラメータをparameterizeすることで独自の乱数源を使うことができます。 パラメータの値はSRFI-27の規定する乱数源でなければなりません (srfi.27 - ランダムビットのソース参照)。

Function: uuid-random-source-set! random-source

{rfc.uuid} Deprecated. UUID生成に使われる乱数源をカスタマイズするには uuid-random-sourceパラメータを使ってください。

Function: uuid1 :optional node-id
Function: uuid6 :optional node-id

{rfc.uuid} それぞれ、バージョン1およびバージョン6アルゴリズム(タイムスタンプとノードID)による UUIDを生成して返します。二つのバージョンの違いは、 バージョン1ではタイムスタンプをいくつかに分けたうちの下位ビットから順に格納する のに対し、バージョン6では上位ビットから格納することです。 これにより、近い時間に作られたv6 uuidはソートした時に固まることになり、 データベースのインデックスとして使う場合にv1より有利になります。 (但し、完全に時間的に整列可能なuuidが必要な場合はv7 uuidを使ってください)。

省略可能なnode-id引数はノードIDを指定する48ビットの正確な整数でなければ なりません (IEEE802 MACアドレスが通常使われます)。 省略された場合は、プロセス内でひとつのランダムノードIDを生成して使います (この場合、生成されるノードIDはマルチキャストビットが立てられるので、 現実に存在するMACアドレスとかぶることはありません)。

Function: uuid4

{rfc.uuid} バージョン4アルゴリズム(乱数)によるUUIDを生成して返します。

Function: uuid7

{rfc.uuid} バージョン7アルゴリズム(時間順列可能)でuuidを作って返します。 uuidは、タイムスタンプ部分と、時間的に単調増加するランダムビット部分からなります。 全体として、uuidをソートすると生成順になります。

ランダムビット部分はUUID RFCの仕様では12ビットのrand_aフィールドと 62bitのrand_bフィールドに分かれています。 RFCではどのようにそれらを埋めるかは具体的に指定されていません。 Gaucheの実装では、それを74ビットの非負整数とみなし。 次の戦略を取ります。

  • プロセスごとに、ランダムの整数を初期値とします。
  • v7 uuidを生成する度に、ランダムな64bit非負整数をフィールドに加算します。 フィールドがオーバーフローしなければそれをそのまま使います。
  • フィールドがオーバーフローした場合、前回の生成からタイムスタンプが進んでいれば、 ラップアラウンドした値を使います。
  • そうでなければ、タイムスタンプが進むまで待って、 ラップアラウンドした値を使います。

「タイムスタンプが進むまで待つ」のは、1msあたり大量のuuid (およそ2000個以上) を作りたい場合に足を引っ張るかもしれません。もしそれが問題になるなら、 v7 uuidを効率よくバッチ生成するAPIを用意します。

Function: nil-uuid

{rfc.uuid} 全てのビットが0であるnil UUIDを返します。

Function: parse-uuid string :key if-invalid

{rfc.uuid} UUIDの文字列表現をパーズし、UUIDインスタンスにして返します。 文字列が有効なUUID表現でない場合、if-invalidキーワード引数が 省略されるか:errorであればエラーが投げられ、 if-invalid#fであれば#fが返されます。

典型的なXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXという形式に加え、 urn:uuid:プレフィクスがついた形、前後がカーリーブレイスで囲まれた形、 そしてハイフンを持たない形が認識されます。

Function: write-uuid uuid :optional port

{rfc.uuid} uuidの文字列表現をXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX形式で portに書き出します。portが省略された場合は現在の出力ポートが使われます。

Function: uuid->string uuid

{rfc.uuid} uuidの文字列表現をXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX形式で 返します。


Next: , Previous: , Up: ライブラリモジュール - ユーティリティ   [Contents][Index]


For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT