C 言語で UUID を利用する : C++ プログラミング

PROGRAM


C 言語で UUID を利用する

何かを一意に識別するのに使われる UUID (Universally Unique Identifiers) や GUID (Globally Unique Identifiers) といった文字列を生成する方法について調べてみました。

C++ 言語では、次のように <uuid/uuid.h> ヘッダーを組み込むことで 128 bit の UUID を簡単に利用できるようになります。

#include <uuid/uuid.h>

利用できるデータ型

<uuid/uuid.h> で組み込まれる機能では、次のデータ型を使って UUID を扱います。

uuid_t UUID をバイナリデータで扱うためのデータ型です。128 bit データが格納されます。
uuid_string_t UUID を文字列で表現したときのデータ型です。末端に NUL を含む C 文字列が格納されます。

UUID を生成する

UUID を生成するには uuid_generate 関数を使用します。

uuid_t value;

 

// UUID を生成します。

uuid_generate(value);

この関数に、あらかじめ定義しておいた uuid_t 型の変数を引数に渡すことで、UUID が生成されて、その値が引数に渡した変数に記録されます。

UUID の値を別の uuid_t 型の変数にコピーする

uuid_t 型の変数に格納されている UUID の値は、uuid_copy 関数を使ってコピーできます。

// srcValue 変数の値を dstValue 変数にコピーします。

uuid_copy(dstValue, srcValue);

引数には uuid_t 型の変数を 2 つ渡します。そうすることで、最初に渡した変数へ、次に渡した変数の値がコピーされます。

UUID の値を文字列に変換する

uuid_t 型の変数に格納された 128 bit の値は uuid_unparse_upper 関数や uuid_unparse_lower 関数を使って文字列化できます。

この関数の引数には uuid_t 型の値と、文字列化した値を格納するのにつかう uuid_string_t 型の変数を渡します。

// 次の変数に、文字列化した UUID を格納します。

uuid_string_t string;

 

// uuid_t 型の変数 'uuid' の値を文字列に変換して 'string' 変数に格納します。

uuid_unparse_upper(uuid, string);

このようにすることで、変数 string には "AFF95DA3-B2C9-4596-9D2E-3ABEEFD3259A" というような UUID 文字列が格納されます。末端は NUL 文字が入れらるので、この変数を C 言語の文字列として利用できます。

なお、uuid_unparse_upper 関数は UUID のアルファベット部分を大文字表記で扱いますが、uuid_unparse_lower 関数を使うと、アルファベット部分を小文字表記にできます。

UUID 文字列から uuid_t 型の値を生成する

uuid_t 型の変数に任意の UUID を設定したい場合は、uuid_parse 関数を使用します。

uuid_t value;

 

// UUID を生成します。

value = uuid_parse("AFF95DA3-B2C9-4596-9D2E-3ABEEFD3259A", value);

このようにすることで、最初の引数で指定した文字列で表現された UUID の値を、次の引数で指定した uuid_t 型の変数に設定できます。

上の例では文字列定数を指定していますが、ここには uuid_string_t 型の変数を指定することも可能です。

NULL を表現する UUID を扱う

<uuid/uuid.h> には、NULL を表現する UUID も扱えるようになっています。

NULL を表現する UUID というのは、具体的には "00000000-0000-0000-0000-000000000000" というものになるようですが、これを uuid_t 型の変数に設定したい場合は、次のようにします。

// NULL を現す UUID を、変数 value に設定します。

uuid_clear(value);

また、変数 value に設定されている UUID が NULL を表しているかを判定するには、次のようにします。

if (uuid_is_null(value) != 0)

{

}

uuid_is_null 関数は、引数に渡した uuid_t 型の値が NULL を表すものだった場合に 1 を、そうでなければ 0 を返すので、それを使って UUID が NULL かどうかを判断できます。

二つの UUID が一致するかを判定する

uuid_compare 関数を使うと、引数に指定した二つの uuid_t 型の値の大小関係を判定できます。

uuid_compare(value1, value2)

引数に渡した二つの値が一致する場合に 0 を返すので、一致したかは "if (uuid_compare(value1, value2) == 0)" というように判定できます。

また、使いどころがあるかは分かりませんが、最初の引数に渡した UUID の値が、二つ目の UUID と比べて、辞書的にみて小さい場合は 0 より小さい値が、大きい場合は 0 より大きい値が返されるので、これによって二つの UUID の大小関係を把握することも可能になっています。

[ もどる ]