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

12.26 data.ulid - 一意で辞書順ソート可能な識別子

Module: data.ulid

このモジュールは、https://github.com/ulid/spec で定義されているULIDを実装します。 これはUUIDに似た一位な識別子ですが、生成順序と辞書順序が一致します。 また、UUIDよりもコンパクトな文字列表現を持ちます。

(define gen-ulid (make-ulid-generator))

(gen-ulid) ⇒ #<ulid 01G70P3EWJT28VPQ12NTFFDSZ1>

(ulid->string (gen-ulid)) ⇒ "01G70P3Y72TQ1HYY90G8TJSY07"

註: 新しいUUID RFC (RFC9562)には、ULIDと同様の単調増加属性を持つUUID version 7 が含まれています。詳しくはrfc.uuid - UUIDを参照のこと。

Function: make-ulid-generator :optional random-source

呼ばれるたびに新たなULIDオブジェクトを返すジェネレータを作って返します。 省略可能なrandom-source引数はSRFI-27の乱数源で、ULIDの乱数部を生成するのに 使われます (srfi.27 - ランダムビットのソース参照)。 省略された場合は内部の乱数源が使われます。

一意性と単調増加特性を保証するために、ULIDジェネレータは内部に状態を保持しています。 作られたジェネレータを複数のスレッドで共有する場合は、呼び出し側で排他制御してください。 ジェネレータをひとつのスレッド内で使う限りにおいては排他制御のオーバヘッドを避けることができます (ただ、単調増加特性はジェネレータごとにしか保証されません)。

ULIDは48ビットのタイムスタンプ(Unixエポックからのミリ秒)と、80ビットのランダムネスフィールド から成ります。ランダムネスフィールドはそのミリ秒の時刻で初めてULIDが生成される場合は ランダムに埋められ、同じミリ秒内で2個め以降のULIDが生成される場合は前回の ランダムネスフィールドをインクリメントしたものが使われます。 これによって生成順序と辞書順序が一致します。

ULID仕様では、同じミリ秒内で多数のULIDが生成されたためにランダムネスフィールドがオーバーフロー した場合はエラーとしています。それが起きる可能性は極めて小さいですが、起き得ることです。 Gaucheの実装では、ランダムネスフィールドがオーバーフローした場合は次のミリ秒まで待つことで、 エラーにならないようにしています。

Function: ulid? obj

objがULIDオブジェクトなら#tを、そうでなければ#fを返します。

Function: ulid-timestamp ulid

ulidのタイムスタンプ部(48bit)を正確な整数で返します。

Function: ulid-randomness ulid

ulidのランダムネス部(80bit)を正確な整数で返します。

Function: ulid=? ulid1 ulid2

二つのULIDが等価であれば#tを、そうでなければ#fを返します。

Function: ulid<? ulid1 ulid2

辞書順比較でulid1ulid2よりも小さければ#tを、 そうでなければ#fを返します。二つのULIDが同じジェネレータで 生成されていたなら、これはulid1ulid2より前に生成されたことを意味します。 二つが異なるジェネレータで生成されていた場合は、ミリ秒より小さな間隔において 生成順が辞書順とは異なっている可能性があります。

Function: ulid-hash ulid

ulidのハッシュ値を非負の正確な整数で返します。

Variable: ulid-comparator

ULIDの比較およびハッシュに使える比較器です。

Function: ulid->bytevector ulid
Function: bytevector->ulid uv

ulidと長さ16のu8vector間の変換手続きです。 ビットはビッグエンディアンで格納されます(タイムスタンプの先頭8ビットが最初のバイト、等)。

Function: ulid->integer ulid
Function: integer->ulid n

ulidと非負の正確な128ビット整数との間の変換手続きです。

Function: ulid->string ulid
Function: string->ulid str

ulidとそのBase32文字列表現との間の変換手続きです。 エンコードディジットには0123456789ABCDEFGHJKMNPQRSTVWXYZが使われます (ILOUは混乱を避けるために使われません)。 文字列の長さは常に26です。

ulid->stringは常に大文字を使います。 一方、string->ulidは小文字も大文字も受け付けます。



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