uuid-ossp 拡張機能は、汎用一意識別子 (UUID) を生成するための関数を提供します。分散システムにおいて、UUID はシーケンスよりも強力な一意性を保証するため、ノードをまたいだプライマリキーやレコード識別子として信頼性の高い選択肢となります。
UUID フォーマット
UUID は 32 桁の 16 進数で構成され、ハイフンで 8-4-4-4-12 の 5 つのグループに区切られます。例:
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11PostgreSQL は、いくつかの同等のフォーマットで UUID を受け入れます:
| フォーマット | 例 |
|---|---|
| 標準 (小文字) | a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 |
| 大文字 | A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11 |
| 中かっこ | {a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} |
| ハイフンなし | a0eebc999c0b4ef8bb6d6bb9bd380a11 |
| 4 桁ごとのハイフン | a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11 |
| 混合 | {a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11} |
UUID フィールドは、AnalyticDB for PostgreSQL で分散キーとして使用することはできません。
拡張機能のインストール
UUID を生成する前に、ご利用のインスタンスの [拡張機能] ページから uuid-ossp 拡張機能をインストールしてください。詳細については、「拡張機能のインストール、更新、アンインストール」をご参照ください。
UUID 生成関数
バージョン 1:時間ベース
uuid_generate_v1() は、現在のタイムスタンプとホストマシンの MAC アドレスから UUID を生成します。
uuid_generate_v1mc() は uuid_generate_v1() と同様に動作しますが、実際の MAC アドレスの代わりにランダムなマルチキャスト MAC アドレスを使用するため、マシンのハードウェア識別子が直接公開されるのを防ぎます。
バージョン 1 の UUID は、生成元マシンの MAC アドレスを埋め込み、時間コンポーネントを含むため、ある程度予測可能です。セキュリティが重視されるアプリケーションでは、バージョン 1 の UUID の使用を避けてください。
バージョン 3:名前ベース (MD5)
uuid_generate_v3(namespace uuid, name text) は、MD5 を使用して namespace 内の name をハッシュ化することにより、決定的な UUID を生成します。
namespace:uuid_ns_*()関数のいずれかによって返される定数です (「名前空間定数」をご参照ください)。name:名前空間内の識別子です。
SELECT uuid_generate_v3(uuid_ns_url(), 'example.com');同じ入力は常に同じ UUID を生成します。ランダムなアルゴリズムやシステム環境は関与しないため、結果は完全に再現可能です。
バージョン 4:ランダム
uuid_generate_v4() は、乱数に基づいて UUID を生成します。
バージョン 5:名前ベース (SHA-1)
uuid_generate_v5(namespace uuid, name text) は uuid_generate_v3() と同様に動作しますが、MD5 の代わりに SHA-1 を使用します。SHA-1 は MD5 よりも安全であるため、名前に基づく UUID が必要な場合は、バージョン 3 よりもバージョン 5 を使用することを推奨します。
名前空間定数
これらの定数を namespace 引数として uuid_generate_v3() および uuid_generate_v5() で使用します。
| 関数 | 名前空間 |
|---|---|
uuid_ns_dns() | ドメインネームシステム (DNS) |
uuid_ns_url() | URL |
uuid_ns_oid() | ISO オブジェクト識別子 (OID) — ASN.1 (Abstract Syntax Notation One) 標準で定義されており、PostgreSQL の OID とは異なります |
uuid_ns_x500() | X.500 識別名 (DN) |
uuid_nil() は nil UUID 定数を返しますが、これは実際の UUID ではありません。
例
-- バージョン 1 (時間ベース)
SELECT uuid_generate_v1(); uuid_generate_v1
--------------------------------------
c7f83ba4-bd93-11e9-8674-40a8f01ec4e8
(1 row)-- バージョン 3 (名前ベース, MD5)
SELECT uuid_generate_v3(uuid_ns_url(), 'example.com'); uuid_generate_v3
--------------------------------------
a0473a67-27a1-3c05-a2d1-5c134639347f
(1 row)-- バージョン 4 (ランダム)
SELECT uuid_generate_v4(); uuid_generate_v4
--------------------------------------
d7a8d47e-58e3-4bd9-9340-8553ac03d144
(1 row)-- バージョン 5 (名前ベース, SHA-1)
SELECT uuid_generate_v5(uuid_ns_url(), 'example.com'); uuid_generate_v5
--------------------------------------
a5cf6e8e-4cfa-5f31-a804-6de6d1245e26
(1 row)