絶対に重複しないID ~UUIDことはじめ~

default eye catch プログラミング

UUID基礎

UUIDとはUniversally Unique Identifierの略称であり、コンピュータシステム上で対象を一意に識別するためのIDのことです。

IDをいつどこで生成しても、過去/未来のどのIDとも重複しないことが約束されているため、
ソフトウェア上でのオブジェクトを一つに特定したい時に付与するIDとして汎用的に使われます。

IDは128ビットであり、
1a2b3c4d-5ad4-4142-c7a5-1234abcd5678 のような16進数の数値+ハイフンで表されます。

その規格はIETFにRFC4122として定められています。

RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace

UUIDはIDの厳密な生成方法の違いによって、バージョン分けされています。
今現在、ウェブアプリケーションなどソフトウェアで幅広く使われているのはバージョン4という印象です。

ちなみに、バージョン4は乱数を用いてIDを生成するのが特徴です。
(他のバージョンでは時刻を使ったりMACアドレスを使ったりと、さまざまなパターンがあります。
ここのあたりのアルゴリズム関連は小難しい話になってしまうのでwikipedia先生に頼ることをお勧めします→https://ja.wikipedia.org/wiki/UUID

バージョンは判別可能

どのバージョンで生成されたIDなのかは、ID文字列から判別することができます。

UUIDは「{8桁}-{4桁}-{4桁}-{4桁}-{12桁}」の構造になっているのですが、
ハイフンで区切った先頭から3つ目のかたまり(4桁)の冒頭一文字が、そのままバージョンの数値になっています。

例えば、「1a2b3c4d-5ad4-4142-c7a5-1234abcd5678」となっていたら、このIDはバージョン4ということですね。

プログラミング言語ごとのライブラリ

プログラミングをしているとき、一意に判別可能なIDを使いたいという時は多いと思います。

そんな時は自前でIDを生成するアルゴリズムを考えて作ったりはせず、用意されているライブラリを使うことを強くお勧めします。

言語によっては標準のライブラリに備え付けられているものもあります。

Python

Pythonではバージョン2.5以降で、uuidが標準ライブラリとして備わっています。
そのためPythonを使える環境であれば、明示的に外部からライブラリをインポートすることなく使用できます。

uuid --- UUID objects according to RFC 4122
ソースコード: Lib/uuid.py This module provides immutable UUID objects (the UUID class) and the functions uuid1(), uuid3(), uui...

Java

java.utilパッケージにuuidのためのライブラリが組み込まれています。

UUID (Java Platform SE 8)

Ruby

標準ライブラリであるSecureRandomで提供されています。

module SecureRandom (Ruby 3.4 リファレンスマニュアル)
安全な乱数発生器のためのインターフェースを提供するモジュールです。 HTTP のセッションキーなどに適しています。

PHP

ユニークなIDを生成するuniqidという関数はあるのですが、時刻に基づいてIDを生成するのでバージョン4の要件は満たせてなさそうです。
さらに言えば、この関数は戻り値が一意であることを保証していないため、重複が許されないパターンでは使わない方が良さそうです。↓

PHP: uniqid - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites i...

乱数を使用したバージョン4のUUIDを生成するには、自前で関数を実装する必要がありそうです。

Go言語

標準ライブラリには含まれていませんが、外部パッケージでサポートされています。

GitHub - google/uuid: Go package for UUIDs based on RFC 4122 and DCE 1.1: Authentication and Security Services.
Go package for UUIDs based on RFC 4122 and DCE 1.1: Authentication and Security Services. - google/uuid
GitHub - pborman/uuid: Automatically exported from code.google.com/p/go-uuid
Automatically exported from code.google.com/p/go-uuid - pborman/uuid

google/uuidパッケージはpborman/uuidパッケージを元にして作られたもので、両者の違いとしてはIDを配列として保存するか、スライスとして保存するかといったものがあります。

Javascript

バージョン4のuuidを生成するメソッドがあります。一通りの主要ブラウザでも実装済みです。

Crypto: randomUUID() メソッド - Web API | MDN
randomUUID() は Crypto インターフェイスのメソッドで、暗号強度の強い乱数生成器を用いて v4 UUID を生成するのに用いられます。

コメント

タイトルとURLをコピーしました