ULID と UUID: 分散システムでの使用に ULID の方が適しているのはなぜですか?

分散システムでは、一意の識別子 (UUID) が非常に一般的です。これはデータまたはエンティティを識別する方法であり、アルゴリズムに基づいて生成される固定長の文字列です。ただし、UUID には、ランダムに生成されるため並べ替えが難しく、パフォーマンスの問題が発生するなど、いくつかの欠点もあります。ULID は、これらの問題を解決し、追加の利点を提供する新しいソリューションです。
ここに画像の説明を挿入

ULIDとは何ですか?

ULID (Universally Unique Lexicographically Sortable Identifier) は、2016 年に Alizain Feerasta によって提案されたソート可能な一意の識別子です。タイムスタンプと乱数ジェネレーターを組み合わせて、データ エンティティやイベントの識別などの分散シナリオに適した 32 ビットの識別子を生成します。システム内で。
ここに画像の説明を挿入
ULID 仕様では、次の形式が定義されています。

01AN4Z07BY      000000000001  cc1cca9a-3ccd-11e8-9669-57e0c8c9e133
|--------------| |----------| |----------------------------------|
Timestamp        Randomness   Unique Identifier
   10 chars         6 chars             16 chars

このうち、Timestamp(タイムスタンプ)とRandomness(乱数)は合計16文字を占め、Unique Identifier(固有の識別子)は合計16文字を占めます。ULID の生成順序は、タイムスタンプが早い ULID が最初で、タイムスタンプが同じ場合は乱数が小さい ULID が最初になります。

具体的には、タイムスタンプ部分は、Unix タイムスタンプ (1970 年 1 月 1 日以降) のミリ秒を Base32 エンコードすることによって取得され、最初の 10 文字を占めます。ランダム部分は、CSPRNG (Cryptographically Secure Pseudo-Random Number Generator) によって生成される 6 バイトの乱数で、base32 エンコードによって取得され、次の 6 文字を占めます。Unique Identifier 部分は 16 文字の UUID であり、ULID のグローバルな一意性を保証するために使用されます。

ULID の例を次に示します。

01F9K1BCRK7X6T9GH6AA7YP6GW
|------------| |-------| |---------------|
Timestamp  Randomness  Unique Identifier
01F9K1BCRK     7X6T9G      H6AA7YP6GW

ULID を生成するにはどうすればよいですか?

ULID の生成には、タイムスタンプとノンスという 2 つの部分が必要です。タイムスタンプ部分は、ミリ秒単位の精度の UTC 時間を使用して、ULID の最初の 12 文字を占めます。乱数部分は、CSPRNG に基づく乱数ジェネレーターを使用して、ULID の最後の 18 文字を占めます。

この生成方法を使用すると、生成された ULID がグローバルに一意であり、並べ替え可能であることが保証されます。さらに、ULID はタイムスタンプ ベースのプレフィックスを使用するため、最初の 12 文字を使用して ULID がいつ生成されたかを判断できるようになります。これは、デバッグやデータ管理に非常に役立ちます。

ULID を使用する理由

ULID には UUID に比べていくつかの利点があります。
ここに画像の説明を挿入

  • ソート可能: ULID はタイムスタンプに基づいて生成されるため、タイムスタンプでソートでき、データベースのインデックス作成やクエリに非常に役立ちます。また、ULID はタイムスタンプ ベースのプレフィックスを使用するため、最初の 12 文字を使用してタイムスタンプを決定できるため、デバッグとデータ管理が容易になります。
  • 可読性: ULID は 32 文字で構成され、最初の 12 文字はタイムスタンプによって生成され、タイムスタンプはこれら 12 文字によって決定できます。これは、デバッグやデータ管理に非常に役立ちます。
  • 低い衝突率: ULID の衝突率は、タイムスタンプ ベースのプレフィックスと乱数ジェネレーターを使用して ULID を生成するため、非常に低く、生成される ULID はグローバルに一意になります。
  • 短くて軽量: ULID の文字数は 32 文字のみですが、UUID の文字数は 36 文字です。つまり、ULID の方が短く、軽量で、分散システムでの使用に適しています。
  • セキュリティ: ULID は、CSPRNG ベースの乱数ジェネレーターを使用して乱数部分を生成するため、セキュリティが強化され、攻撃に対する脆弱性が低くなります。

ULID を実際に使用するにはどうすればよいですか?

アプリケーションで ULID を使用する場合は、既存の ULID ライブラリを使用して ULID を生成できます。以下に、人気のある ULID ライブラリをいくつか示します。

  • ulid (https://github.com/ulid/spec): これは、Go、Java、JavaScript、Python、Ruby などの複数のプログラミング言語をサポートする公式の ULID 実装ライブラリです。
  • ulid-js (https://github.com/ulid/javascript): これは、ブラウザーと Node.js での使用をサポートする JavaScript 用の ULID 実装ライブラリです。
  • Rust-ulid (https://github.com/mmacedoeu/rust-ulid): これは Rust の ULID 実装ライブラリであり、ULID を生成するための安全で効率的かつ使いやすい方法を提供します。

ULID の使用例は、ULID を主キーとしてデータベースに保存することです。これにより、データベース内のエントリが時間順にソートされ、データベース クエリの効率が向上します。

結論は

ULID は UUID よりも優れたソリューションであり、並べ替え可能性、可読性、衝突率の低さ、短くて軽量、およびセキュリティという利点があります。分散システムでは、ULID を使用すると、データの一意性を確保しながらデータベース クエリの効率を向上させることができます。分散システムを構築している場合は、ULID を使用してデータとエンティティを識別することを検討してください。

おすすめ

転載: blog.csdn.net/KRYST4L123/article/details/129837338