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を参照のこと。
呼ばれるたびに新たなULIDオブジェクトを返すジェネレータを作って返します。
省略可能なrandom-source引数はSRFI-27の乱数源で、ULIDの乱数部を生成するのに
使われます (srfi.27
- ランダムビットのソース参照)。
省略された場合は内部の乱数源が使われます。
一意性と単調増加特性を保証するために、ULIDジェネレータは内部に状態を保持しています。 作られたジェネレータを複数のスレッドで共有する場合は、呼び出し側で排他制御してください。 ジェネレータをひとつのスレッド内で使う限りにおいては排他制御のオーバヘッドを避けることができます (ただ、単調増加特性はジェネレータごとにしか保証されません)。
ULIDは48ビットのタイムスタンプ(Unixエポックからのミリ秒)と、80ビットのランダムネスフィールド から成ります。ランダムネスフィールドはそのミリ秒の時刻で初めてULIDが生成される場合は ランダムに埋められ、同じミリ秒内で2個め以降のULIDが生成される場合は前回の ランダムネスフィールドをインクリメントしたものが使われます。 これによって生成順序と辞書順序が一致します。
ULID仕様では、同じミリ秒内で多数のULIDが生成されたためにランダムネスフィールドがオーバーフロー した場合はエラーとしています。それが起きる可能性は極めて小さいですが、起き得ることです。 Gaucheの実装では、ランダムネスフィールドがオーバーフローした場合は次のミリ秒まで待つことで、 エラーにならないようにしています。
objがULIDオブジェクトなら#t
を、そうでなければ#f
を返します。
ulidのタイムスタンプ部(48bit)を正確な整数で返します。
ulidのランダムネス部(80bit)を正確な整数で返します。
二つのULIDが等価であれば#t
を、そうでなければ#f
を返します。
辞書順比較でulid1がulid2よりも小さければ#t
を、
そうでなければ#f
を返します。二つのULIDが同じジェネレータで
生成されていたなら、これはulid1がulid2より前に生成されたことを意味します。
二つが異なるジェネレータで生成されていた場合は、ミリ秒より小さな間隔において
生成順が辞書順とは異なっている可能性があります。
ulidのハッシュ値を非負の正確な整数で返します。
ULIDの比較およびハッシュに使える比較器です。