C 言語で UUID を利用する : C++ プログラミング
PROGRAM
.auto-style1 {
font-size: 15px;
}
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 の大小関係を把握することも可能になっています。
[ もどる ]