ULID - 分散システムでグローバルに一意な識別子を生成するためのより良い選択肢

ULID - 分散システムでグローバルに一意な識別子を生成するためのより良い選択肢

ULID と UUID

ULID(Universally Unique Lexicographically Sortable Identifier)は、グローバルに一意の識別子を生成するアルゴリズムです。タイムスタンプと乱数を組み合わせて、生成された識別子がソートされたときに時系列順になるようにします。 ULID の形式は、10 個のタイムスタンプ文字と 16 個の乱数文字で構成される 48 文字の文字列です。

ULID の形式は次のとおりです。

 01AN4Z07BY 79KA1307SR9X4MV3 |----------| |----------------| Timestamp Randomness 10 chars 16 chars

ULID のタイムスタンプ部分は、現在の時刻と Unix エポック (1970-01-01) の差で表され、乱数部分では一意性を確保するためにランダムに生成された文字が使用されます。

ULID は、分散システムでグローバルに一意の識別子を生成するように設計されており、データベース内で並べ替えやインデックス付けを行うことができます。

UUID(Universally Unique Identifier)は、情報を一意に識別するために通常使用される 128 ビットの識別子です。これは、数字と文字のグループで構成される 32 文字の文字列で、通常は 8-4-4-4-12 の形式でハイフンで区切られた 5 つのセグメントに分割されます。 UUID 生成アルゴリズムは、時間と空間を問わず一意であることが保証されます。

コンピュータ サイエンスでは、UUID は、データベースの主キーやメッセージ キューのメッセージ識別子など、分散システム内の一意の識別子としてよく使用されます。 UUID の一意性と分散性により、分散システムでは非常に価値が高まります。

UUID にはさまざまなバージョンがあります。

  1. UUIDv1: タイムスタンプと MAC アドレスに基づいて生成されますが、プライバシーとセキュリティのリスクが生じる可能性があります。
  2. UUIDv3: 名前空間と名前の MD5 ハッシュ値に基づいて生成されます。
  3. UUIDv4: 乱数生成に基づいており、高い一意性を備えています。
  4. UUIDv5: 名前空間と名前の SHA-1 ハッシュ値に基づいて生成されます。

UUID の各バージョンには、生成された UUID が分散システム全体で一意であることを保証するための特定の生成アルゴリズムと形式要件があります。

ULID と UUID

ULID は、タイムスタンプと乱数を組み合わせて、分散システムで整然とした一意の識別子を生成する、グローバルに一意の識別子を生成するアルゴリズムです。 ULID の形式は、タイムスタンプと乱数を含む 26 文字の文字列です。

対照的に、UUID は標準化されたグローバルに一意の識別子であり、通常は乱数に基づいて、またはタイムスタンプやコンピューターの MAC アドレスなどの情報に基づいて生成されます。 UUID の形式は 32 文字の文字列で、通常は 32 ビットの 16 進数で表されます。

ULID が UUID よりも優れている点は、タイムスタンプ情報が含まれているためソート可能であり、分散システムで生成された識別子のソートと取得がより効率的になることです。 UUID はグローバルな一意性を重視しますが、分散システムでは並べ替えや取得にパフォーマンス上の問題が発生する可能性があります。

ULIDの特徴と仕様

  1. 「グローバル一意性」: ULID によって生成される識別子はグローバルに一意であり、データ レコード、エンティティ、またはイベントを識別するために使用できます。
  2. 「辞書順に並べ替え可能」: ULID はタイムスタンプと乱数に基づいて生成されるため、辞書順に並べ替えることができ、データベースの主キーまたはインデックスとして使用するのに適しています。
  3. 「読みやすさ」: ULID は Crockford の Base32 に基づくエンコーディングを使用するため、生成された識別子は文字列形式で表示でき、比較的読みやすくなります。
  4. 「時間順」: ULID の前半部分にはタイムスタンプ情報が含まれているため、ULID に基づいて生成時刻を推測できます。

ULID の形式は通常 01AN4Z07BY で、10 ビットのタイムスタンプと 16 ビットの乱数で構成されます。具体的な生成アルゴリズムについては、ULID 仕様を参照してください。

ULID仕様:

  1. 長さは 128 ビットで、タイムスタンプと乱数で構成されます。
  2. 順序を保証するためにタイムスタンプを使用し、一意性を保証するために乱数を使用します。
  3. Crockford の Base32 エンコーディングを使用して、印刷可能な ASCII 文字列を生成します。

ULID の形式は次のとおりです。

 01AN4Z07BY 79KA1307SR9X4MV3 |----------| |----------------| Timestamp Randomness 10 chars 16 chars

ULID のタイムスタンプ部分は、現在の時刻と Unix エポック (1970-01-01) の差としてミリ秒単位の精度で表されます。乱数部分では、一意性を保証するために安全な乱数生成アルゴリズムを使用します。 ULID は、分散システムでグローバルに一意の識別子を生成するように設計されており、時間で並べ替えることができます。

  1. タイムスタンプ: 最初の 48 ビットを占め、ミリ秒単位の精度を持つ自己増加する UTC タイムスタンプです。
  2. 乱数: 最後の 80 ビットを占め、乱数生成アルゴリズムを使用して生成されます。

ULID の構成は次のとおりです。

ULID は 32 個の印刷可能な文字で構成され、Crockford の Base32 エンコーディングを使用して表されます。具体的な形式は次のとおりです。

 tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt

このうち、先頭のタイムスタンプ部分は最初の 48 ビットを占め、後部の乱数部分は後ろの 80 ビットを占めます。

ULID申請

ULID は通常、次のようなグローバルに一意の識別子を生成し、時間順に並べる必要があるさまざまな分散システム シナリオで使用されます。

  1. データベースの主キー: 分散システムでは、ULID をデータベース テーブルの主キーとして使用して、各レコードに一意の識別子が付与され、生成時間で並べ替えられるようになります。
  2. ログ追跡: ログ システムでは、ULID をログ エントリの一意の識別子として使用して、ログの追跡と並べ替えを容易にすることができます。
  3. 分散システムにおけるトランザクション識別: 分散システムでは、ULID をトランザクションの一意の識別子として使用して、各トランザクションがグローバルに一意の識別子を持つことを保証できます。

Java で ULID を使用するには、Maven または Gradle を使用して追加できる ULID ライブラリ依存関係をプロジェクトに追加する必要があります。

Maven を使用して ULID ライブラリ依存関係を追加します。

 <dependency> <groupId>de.huxhorn.sulky</groupId> <artifactId>de.huxhorn.sulky.ulid</artifactId> <version>2.0.0</version> </dependency>

Gradle を使用して ULID ライブラリ依存関係を追加します。

 implementation 'de.huxhorn.sulky:de.huxhorn.sulky.ulid:2.0.0'

ULID ライブラリの依存関係を追加した後、Java コードで ULID を使用して一意の識別子を生成できます。

 import de.huxhorn.sulky.ulid.ULID; public class Main { public static void main(String[] args) { ULID.Value ulid = new ULID().nextValue(); System.out.println(ulid); } }

<<:  Kubernetes のコンテナタイプを調べる

>>:  「オルタナティブクラウド」移行戦略 | 3種類のクラウド移行パス、複数当事者のコラボレーション

推薦する

代替ビジネスであるwidevpsがサーバー価格の底値に挑戦

特別な注意: 慎重に購入し、データのセキュリティに注意してください。 widevps は設立されてま...

5月3日の大きなPRアップデートについての私の考えを話します

2012年のランタンフェスティバルに関する最後のPR更新(2月6日)に続き、昨夜21時頃にいくつかの...

ウェブサイトのHTML生成と最適化について話す

昔々、検索エンジンが静的なHTMLページを好むというインクルージョンルールで交渉したとき、いくつかの...

Kafkaの独創的な高性能設計の1つ

[[420235]]これは、Kafka に関するシリーズ「Mastering MQ」の 4 番目の記...

朗報:budgetvmはCN2ネットワーク、10Gポートにアクセス可能、価格は変更なし

Enzuは、10GポートがCN2ネットワークに接続され、budgetvmブランドが完全に接続され、価...

justg: 日本のネイティブ IP 高速 VPS、Netflix/tiktok/chatgpt のブロック解除、1Gbps 帯域幅、年間 49.99 ドル

justg は最近、新しい日本の VPS シリーズをリリースしました。このシリーズはデフォルトでネイ...

Docker の紹介とインストール、10 分間の入門ガイド

1. Docker とは何ですか?なぜDockerなのかショッピング モールを開発していて、ラップト...

クラウドコンピューティングとは何ですか?今知っておくべきことすべて

クラウド コンピューティングは、コンピューティング、ストレージ、ネットワーク インフラストラクチャを...

SEO最適化で注意すべき要素の解釈

SEO 業界は、ウェブサイトのプロモーションにおいて最も人気のある技術業界の 1 つになりました。現...

生成AIにおける新たな高収入の仕事

クラウドプロバイダーのサービスの需要は2024年まで増加すると予測しています。また、 AI生成技術の...

ロボットファイルの詳細におけるよくある3つの間違いの簡単な例

Robots.txt ファイルには数行の文字しかないように見えますが、実際には注意を払う必要がある詳...

Kafka はなぜこんなに速いのでしょうか?

システム設計では、メッセージ ミドルウェアは、サービスを非同期にしたり、システムを分離したり、トラフ...

友人にリンクを返すことがSEO最適化の鍵です

現在、一定の関連性、発展の可能性があるフレンドリーリンクの見つけ方、フレンドリーリンクが多すぎないこ...

ブラック 5 プロモーション: a2hosting-50% オフ/SSD/無制限のスペース/SS サポート

A2hosting、ブラックフライデーがやって来ました! SSD ハード ドライブを搭載した仮想ホス...