1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UUIDの基本

UUID (Universally Unique Identifier) は、世界中で一意となるように設計された128ビットの識別子です。日本語では「汎用一意識別子」と呼ばれています。

UUIDは以下のような形式で表現されます。

550e8400-e29b-41d4-a716-446655440000

この文字列は、8-4-4-4-12桁の16進数をハイフンで区切った形式になっています。

なぜUUIDが必要なのか

従来のデータベースでは、連番のIDを使用することが一般的でした。しかし、分散システムやマイクロサービスアーキテクチャでは、以下の課題が生じます。

  • 複数のサーバーで同時にIDを生成する際、重複を避けるための調整が必要
  • データベースへの問い合わせなしにIDを生成できない
  • システム間でデータを統合する際にID衝突が発生する

UUIDを使用することで、これらの問題を解決できますね。中央管理なしで一意なIDを生成できるため、分散環境でも安全に利用できます。

UUIDのバージョン

UUIDには複数のバージョンがあり、それぞれ異なる生成方法を持っています。

Version 1: タイムスタンプベース

生成時刻とMACアドレスを組み合わせて生成します。

特徴

  • 時系列でソート可能
  • MACアドレスが含まれるため、生成元が特定できる
  • プライバシーの懸念がある

Version 3/5: ハッシュベース

名前空間と名前を組み合わせてハッシュ化します。Version 3はMD5、Version 5はSHA-1を使用します。

特徴

  • 同じ入力からは常に同じUUIDが生成される
  • 冪等性が必要な場合に有効

Version 4: ランダム

122ビットがランダムに生成されます。現在最も広く使われているバージョンです。

特徴

  • 実装がシンプル
  • プライバシー保護に優れる
  • 衝突の可能性は極めて低い(約2^61個生成して初めて衝突確率が50%)

Version 6/7: 改良版

Version 1の改良版で、より優れた時系列ソート性能を持ちます。

バージョンの選び方

一般的な用途ではVersion 4が推奨されます。データベースのインデックス性能を重視する場合はVersion 7を検討しましょう。

実装例

各プログラミング言語でのUUID生成方法を見てみます。

Python

import uuid

# Version 4(ランダム)
id = uuid.uuid4()
print(id)  # 550e8400-e29b-41d4-a716-446655440000

# Version 5(名前ベース)
namespace = uuid.NAMESPACE_DNS
name = "example.com"
id = uuid.uuid5(namespace, name)

JavaScript/TypeScript

import { v4 as uuidv4 } from 'uuid';

const id = uuidv4();
console.log(id);

Java

import java.util.UUID;

UUID id = UUID.randomUUID();
System.out.println(id);

UUIDの構造

UUIDの内部構造を理解すると、より効果的に活用できます。

メリットとデメリット

メリット

  • 分散環境で中央管理なしに一意なIDを生成可能
  • データベースへの問い合わせが不要
  • システム間のデータ統合が容易
  • 予測不可能性(セキュリティ向上)

デメリット

  • 連番IDと比較してサイズが大きい(128ビット vs 32/64ビット)
  • ランダムなためデータベースインデックスの性能に影響する可能性
  • 人間が読みにくい

データベースでの使用時の注意点

UUIDをデータベースの主キーとして使用する場合、パフォーマンスに影響する可能性があります。

対策

  • Version 7など時系列順序を持つバージョンを使用する
  • バイナリ形式で保存する(文字列形式の36バイトではなく16バイト)
  • 適切なインデックス戦略を採用する
-- PostgreSQLでの例
CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

まとめ

UUIDは分散システムにおいて非常に有用な識別子です。適切なバージョンを選択することで、システムの要件に合わせた実装が可能になります。

  • 一般的な用途: Version 4
  • 時系列ソートが必要: Version 7
  • 冪等性が必要: Version 5
  • レガシーシステム: Version 1

現代のアプリケーション開発において、UUIDは標準的な選択肢の一つとなっていますね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?