w

UUID ジェネレーター

UUID とは?

UUID(Universally Unique Identifier、汎用一意識別子)は、コンピュータシステムで情報を一意に識別するために使用される 128 ビットの数値です。UUID は GUID(Globally Unique Identifier、グローバル一意識別子)とも呼ばれます。

UUID の特徴

  • 一意性:分散システムで重複 UUID が生成される確率は極めて低い
  • 標準化:RFC 4122 標準に準拠
  • クロスプラットフォーム:異なるオペレーティングシステムとプログラミング言語で使用可能
  • 非中央集権:中央調整機関が不要

UUID の応用シーン

  1. データベース主キー:分散データベースの主キーとして
  2. ファイル識別:ファイルシステム内のファイルを識別
  3. セッション管理:Web アプリケーションのセッション識別
  4. メッセージキュー:メッセージの一意識別
  5. API インターフェース:API リクエストとレスポンスの識別

UUID バージョン詳細

UUID v1(時間とノードベース)

形式xxxxxxxx-xxxx-1xxx-yxxx-xxxxxxxxxxxx

特徴

  • 現在時刻とノード ID(通常は MAC アドレス)に基づく
  • タイムスタンプ情報を含み、時間順にソート可能
  • MAC アドレス情報が漏洩する可能性がある

生成アルゴリズム

// 疑似コード例
function generateUUIDv1() {
  const timestamp = Date.now();
  const nodeId = getMACAddress();
  const clockSeq = random16Bit();

  return formatUUID(timestamp, clockSeq, nodeId);
}

UUID v3(名前空間と MD5 ベース)

形式xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx

特徴

  • 名前空間 UUID と名前の MD5 ハッシュに基づく
  • 同じ名前空間と名前は常に同じ UUID を生成
  • 決定論的 UUID が必要なシーンに適用

生成アルゴリズム

function generateUUIDv3(namespace, name) {
  const namespaceBytes = parseUUID(namespace);
  const nameBytes = Buffer.from(name, 'utf8');
  const hash = crypto
    .createHash('md5')
    .update(Buffer.concat([namespaceBytes, nameBytes]))
    .digest();

  return formatUUIDv3(hash);
}

UUID v4(ランダム生成)

形式xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

特徴

  • 完全にランダム生成
  • 最も一般的に使用される UUID バージョン
  • 意味のある情報を含まない

生成アルゴリズム

function generateUUIDv4() {
  const bytes = crypto.randomBytes(16);
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // バージョン 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // バリアント

  return formatUUID(bytes);
}

UUID v5(名前空間と SHA-1 ベース)

形式xxxxxxxx-xxxx-5xxx-yxxx-xxxxxxxxxxxx

特徴

  • 名前空間 UUID と名前の SHA-1 ハッシュに基づく
  • v3 より安全(MD5 ではなく SHA-1 を使用)
  • 決定論的 UUID が必要なシーンに適用

UUID NIL(空 UUID)

形式00000000-0000-0000-0000-000000000000

特徴

  • すべてのビットが 0
  • "UUID なし" または "不明な UUID" を表すために使用
  • データベース設計でデフォルト値として使用

事前定義された名前空間

標準名前空間 UUID

  • DNS 名前空間6ba7b810-9dad-11d1-80b4-00c04fd430c8
  • URL 名前空間6ba7b811-9dad-11d1-80b4-00c04fd430c8
  • OID 名前空間6ba7b812-9dad-11d1-80b4-00c04fd430c8
  • X.500 DN 名前空間6ba7b814-9dad-11d1-80b4-00c04fd430c8

使用例

// DNS 名前空間を使用して UUID v3 を生成
const dnsNamespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
const uuid = generateUUIDv3(dnsNamespace, 'example.com');
// 結果:5df41881-3aed-3515-88a7-2f4a814cf09e

API インターフェース

単一 UUID 生成

// UUID v4 を生成
const uuid = generateUUID('v4');

// UUID v1 を生成
const uuid = generateUUID('v1');

// UUID v3 を生成
const uuid = generateUUID('v3', {
  namespace: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
  name: 'example.com',
});

バッチ UUID 生成

// バッチ UUID 生成
const uuids = generateMultipleUUIDs('v4', 10);

// 異なるバージョンの UUID を生成
const mixedUUIDs = generateMultipleUUIDs(['v1', 'v4', 'v5'], 5);

UUID 検証

// UUID 形式を検証
const isValid = validateUUID('550e8400-e29b-41d4-a716-446655440000');

// UUID バージョンを取得
const version = getUUIDVersion('550e8400-e29b-41d4-a716-446655440000');

パフォーマンス考慮事項

生成速度

  • v4(ランダム):最速、約 100,000 UUID/秒
  • v1(時間):中程度、約 50,000 UUID/秒
  • v3/v5(ハッシュ):遅い、約 10,000 UUID/秒

メモリ使用量

  • 各 UUID は 16 バイトを占有
  • バッチ生成時はメモリ使用量に注意

並行安全性

  • v4 は暗号学的に安全な乱数生成器を使用
  • v1 はクロックシーケンスの一意性を確保する必要がある

ベストプラクティス

UUID バージョンの選択

  1. 一般的な用途:UUID v4 を使用
  2. 時間順ソートが必要:UUID v1 を使用
  3. 決定論的が必要:UUID v3 または v5 を使用
  4. データベース主キー:UUID v4 を推奨

ストレージ最適化

-- PostgreSQL での UUID ストレージ
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(255)
);

-- インデックス作成
CREATE INDEX idx_users_id ON users(id);

パフォーマンス最適化

// オブジェクトプールを使用してメモリ割り当てを削減
const uuidPool = new Array(1000).fill(null).map(() => generateUUIDv4());

// バッチ生成時に Web Workers を使用
const worker = new Worker('uuid-worker.js');
worker.postMessage({ type: 'generate', count: 1000 });

よくある質問

Q: UUID と GUID の違いは?

A: UUID と GUID は本質的に同じで、名前が異なるだけです。UUID は RFC 標準用語、GUID は Microsoft の用語です。

Q: UUID は重複しますか?

A: 理論的には可能ですが、確率は極めて低いです。v4 UUID の重複確率は約 2.71 × 10^-36 です。

Q: UUID バージョンはどう選べばいいですか?

A: 要件に応じて選択:

  • ランダム性が必要:v4
  • 時間情報が必要:v1
  • 決定論的が必要:v3 または v5

Q: UUID はデータベースパフォーマンスに影響しますか?

A: 影響する可能性があります。UUID は整数主キーより大きいため。推奨:

  • B-tree インデックスを使用
  • UUID v1(時間順ソート)の使用を検討
  • 適切な場合は整数主キーを使用

関連ツール

技術仕様

RFC 標準

  • RFC 4122:UUID 仕様
  • RFC 4122 Section 4.1.3:UUID バージョン定義

プログラミング言語サポート

  • JavaScriptcrypto.randomUUID()(Node.js 14.17+)
  • Pythonuuid モジュール
  • Javajava.util.UUID
  • C#System.Guid

最終更新日:2024年1月20日

Was this page helpful?