UUID (Universally Unique Identifier) は空間的・時間的に一意な識別子です。UUIDは、極めて短い間しか存在しないオブジェクトの特定からネットワーク上で長い間存在するオブジェクトを確実に識別するなど多目的に使用することができます。

java.util.UUID
Figure 1. java.util.UUID

UUIDとは

UUID (Universally Unique Identifier) は空間的・時間的に一意な識別子です。UUIDは、極めて短い間しか存在しないオブジェクトの特定からネットワーク上で長い間存在するオブジェクトを確実に識別するなど多目的に使用することができます。

UUIDの作成にあたって個々の識別子を何らかの認定機関に登録する必要はありません。そのかわり、各 UUID ジェネレータで一意な値を必要とします。この空間的にユニークな値は通常ネットワーク接続システムで適用されているIEEE 802アドレスで特定されます。

UUIDのバージョン

UUIDにはいくつかのバージョンがある。

UUIDのバージョン
バージョン 説明
1 MACアドレス及び日付時刻から生成するUUID
2 MACアドレス、日付時刻及びPOSIXユーザIDから生成するUUID
3 URL、完全修飾ドメイン名、オブジェクト識別子及び識別名から生成するUUID
4 擬似乱数から生成するUUID

UUIDの形式と桁数

UUID はフィールド間にパディングを含まない128ビットの領域から構成されます。

UUIDを16進数の文字列で表現するときは次のように表記する。

<time_low>-<time_mid>-<time_hi_and_version>-<clock_seq_hi_and_reserved><clock_seq_low>-<node>

例)2fac1234-31f8-11b4-a222-08002b34c003

フィールド データ型
time_low Unsigned 32-bit integer
time_mid Unsigned 16-bit integer
time_hi_and_version Unsigned 16-bit integer
clock_seq_hi_and_reserved Unsigned 8-bit integer
clock_seq_low Unsigned 8-bit integer
node Unsigned 48-bit integer
time_low
タイムスタンプの下位フィールド。

タイムスタンプは符号なし60ビット整数値である。UUID バージョン1では 1582年10月15日 00:00:00.00 からの経過時間を 100 ナノ秒単位で表した UTC(Coordinated Universal Time)として格納されます。

time_mid
タイムスタンプの中位フィールド。
time_hi_and_version
タイムスタンプの上位フィールドとバージョン番号の複合。(*1)
time_hi_and_version
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
version time_hi
UUIDバージョンフィールド
bit 説明
0001 バージョン1
0010 バージョン2
0011 バージョン3
0100 バージョン4
clock_seq_hi_and_reserved
クロックシーケンス(Unsigend 14-bit integer)の上位フィールドと予約領域の複合。
clock_seq_hi_and_reserved
07 06 05 04 03 02 01 00
1 0 clock_seq_hi
clock_seq_low
クロックシーケンス(Unsigend 14-bit integer)の下位フィールド。
node
一意なノード識別子。48-bit IEEE 802アドレスを設定する。

UUIDの生成

WindowsコマンドでUUIDを生成する

Windows に Microsoft Visual C++ がインストールしてあれば、UUID は uuidgen コマンドを使用して作成することができます。

C:\> cd "\Program Files\DevStudio\VC\bin"
C:\Program Files\DevStudio\VC\bin> uuidgen
0e452ba0-0a41-11d2-bd1b-00003987a102

JavaでUUIDを生成する

JavaでUUIDを生成するには、java.util.UUIDクラスを使用する。ただし、java.util.UUIDクラスで生成されるのはバージョン4のUUIDである。JavaにはMACアドレスを取得する機能は組み込まれていない。MACアドレスを取得するにはJNIを使用するか、C言語等のネイティブな機能を呼び出すメソッドを用いなければならない。

public static UUID randomUUID()

JavaでUUIDを生成するサンプルを次に示す。

class UUIDSample {
  public static void main(String[] args) {
    String uuid = java.util.UUID.randomUUID().toString();
    System.out.println(uuid);
  }
}

上記Javaサンプルの実行結果の例を次に示す。

e7d6f43-dcec-423c-88e4-c20c57362cf1

MACアドレスの取得方法

Windows NT 4.0

Windows NT 4.0の場合、レジストリ内の NetworkAddress 値からMACアドレスを取得できます。

レジストリキー:\\HKEY_LOCAL_MACHINE\SOFTWARE\Description\Microsoft\Rpc\UuidTemporaryData

MACアドレスを取得するC言語プログラムの例を次に示します。

HKEY hKey;
char szAddress[256];
DWORD dwType, dwBytes;

RegOpenKeyEx(HKEY_LOCAL_MACHINE,
           "SOFTWARE\Description\Microsoft\Rpc\UuidTemporaryData",
           0, KEY_ALL_ACCESS, &hKey);
RegQueryValueEx(hKey, "NetworkAddress", NULL, &dwType, szAddress, &dwBytes);

Linux

Linux コマンドでMACアドレスを取得するには、ip 又は ifconfig コマンドを実行する。

$ ip link show eth0
5: eth0: <> mtu 1500 group default qlen 1
    link/ether 54:04:da:65:80:86

$ ifconfig -a
lo0: flags=849<UP,LOOPBACK,RUNNING,MULTICAST> mtu 8232
      inet 127.0.0.1 netmask ff000000
le0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST> mtu 1500
      inet 133.113.94.53 netmask ffffff00 broadcast 133.113.94.255
      ether 8:0:20:18:4b:b4

RFC

RFC 4122

関連記事

Linux uuidgen コマンド

参考文献

Oracle (2020) UUID (Java Platform SE 8)

Internet Engineering Task Force (2005) A Universally Unique IDentifier (UUID) URN Namespace