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

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

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

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

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

UUIDフォーマット
フィールド データ型 説明
time_low Unsigned 32-bit integer タイムスタンプの下位フィールド。
time_mid Unsigned 16-bit integer タイムスタンプの中位フィールド。
time_hi_and_version Unsigned 16-bit integer タイムスタンプの上位フィールドとバージョン番号の複合。(*1)
clock_seq_hi_and_reserved Unsigned 8-bit integer クロックシーケンス(Unsigend 14-bit integer)の上位フィールドと予約領域の複合。(*2)
clock_seq_low Unsigned 8-bit integer クロックシーケンス(Unsigend 14-bit integer)の下位フィールド。
node Unsigned 48-bit integer 一意なノード識別子。48-bit IEEE 802アドレスを設定する。

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

(*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
(*2) clock_seq_hi_and_reserved
07 06 05 04 03 02 01 00
1 0 clock_seq_hi

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

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

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

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

UnixコマンドでUUIDを生成するには、uuidgenを使用する。

uuidgen -t|-r
-t

時刻からUUIDを生成する。

-r

擬似乱数からUUIDを生成する。

$ uuidgen -t
3ce61f4a-7dfa-11e5-9366-005056a36e78

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
C:\Program Files\DevStudio\VC\bin>

JavaでUUIDを生成する

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

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アドレスを取得するプログラムの例を次に示します。

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);

Sun Solaris

$ 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
$
スポンサーリンク