英語版
このページの英語版を見る

std.uuid

UUID、つまり 普遍的に一意な識別子、 は、分散環境で情報を一意に識別することを意図している。 中央で調整することなく、情報を一意に識別することを目的としている。これは 非常に寿命の短いオブジェクトにタグを付けたり、非常に永続的なオブジェクトをネットワーク上で確実に識別するために使われる。 を確実に識別するために使用できる。
UUIDには多くの用途がある。以下に例を挙げる:データベースは、行やレコードを識別するためにUUIDを使用する。 データベースは、異なるデータベース間で一意であることを保証するために、行やレコードを識別するためにUUIDを使用することがある。 データベースは行やレコードを識別するためにUUIDを使用する。ネットワークメッセージは ネットワークメッセージは、UUIDで識別されるかもしれない。 を元に戻せるようにするためである。分散コンピューティングは、リモートプロシージャコールを識別するためにUUIDを使用するかもしれない。 トランザクションやシリアライゼーションに関わるクラスは、UUIDで識別することができる。 マイクロソフトのコンポーネント・オブジェクト・モデル(COM)は、異なるソフトウェア・コンポーネントのインターフェースを区別するためにUUIDを使用している。 コンポーネントのインターフェイスを区別する。UUIDはMicrosoft Officeプログラムの文書に挿入される。 UUIDは、Advanced Systems Format(ASF)のオーディオやビデオストリームを識別する。UUIDは OID(オブジェクト識別子)やURN(統一リソース名)の基礎にもなっている。
UUIDの魅力的な特徴は、他のものと比べて相対的にサイズが小さいことである、 128ビット、つまり16バイトである。もうひとつは、UUIDの作成に中央管理機関を必要としないことである。 中央集権的な権威を必要としないことである。
UUIDが定義されたメカニズムのいずれかによって生成されるとき、それらは以下のいずれかであることが保証される。 UUIDは、他のすべての生成されたUUIDとは異なるユニークなものであることが保証されている(つまり、過去に一度も生成されたことがなく、今後も生成されることはない)。 一意である可能性が極めて高い(メカニズムによって異なる)。 一意である可能性が極めて高い(メカニズムに依存する)。
効率化のため、UUIDは構造体として実装されている。したがって、UUIDは明示的に初期化されなければ空である。 である。UUID.empty`が真であればUUIDは空である。空のUUIDは UUID.init に等しく、16バイトすべてが0に設定されたUUIDである。 初期化されたUUIDを取得するには、UUIDのコンストラクタまたはUUID生成関数を使用する。
これはBoostプロジェクトのboost.uuidを移植したもので、よりDに近いAPIを実現するために若干の追加とAPIの変更が加えられている。 よりDに近いAPIに変更されている。
Standards:
Authors:
Johannes Pfau

ソース std/uuid.d

Examples:
import std.uuid;

UUID[] ids;
ids ~= randomUUID();
ids ~= md5UUID("test.name.123");
ids ~= sha1UUID("test.name.123");

foreach (entry; ids)
{
    writeln(entry.variant); // UUID.Variant.rfc4122
}
writeln(ids[0].uuidVersion); // UUID.Version.randomNumberBased
writeln(ids[1].toString()); // "22390768-cced-325f-8f0f-cfeaa19d0ccd"
assert(ids[1].data == [34, 57, 7, 104, 204, 237, 50, 95, 143, 15, 207,
    234, 161, 157, 12, 205]);
UUID id;
assert(id.empty);
struct UUID;
Examples:
UUID id;
assert(id.empty);

id = randomUUID;
assert(!id.empty);

id = UUID(cast(ubyte[16]) [138, 179, 6, 14, 44, 186, 79,
    35, 183, 76, 181, 45, 179, 189, 251, 70]);
writeln(id.toString()); // "8ab3060e-2cba-4f23-b74c-b52db3bdfb46"
enum Variant: int;
RFC 4122は、UUIDの異なる内部データレイアウトを定義している。これらは このモジュールがサポートするUUIDフォーマットである。これらはこのモジュールでサポートされるUUIDフォーマットである。 これらすべてのVariantを読み、比較し、使用することが可能である。 このモジュールによって生成されるUUIDは常にrfc4122フォーマットになる。

注釈: これを std.variant.Variant.

ncs
NCSの下位互換性
rfc4122
RFC 4122で定義されている
microsoft
マイクロソフト社の後方互換性
future
将来の使用のために予約されている
enum Version: int;
RFC 4122は異なるUUIDバージョンを定義している。バージョンは 例えば、バージョン4のUUIDは乱数から、バージョン3のUUIDはMD5から生成される。 は乱数から、バージョン3のUUIDは名前のMD5ハッシュから生成される。

注釈: これらのUUIDバージョンはすべて std.uuid しかし、生成できるのはバージョン3、4、5のUUIDだけである。

unknown
不明なバージョン
timeBased
バージョン1
dceSecurity
バージョン2
nameBasedMD5
バージョン3(名前ベース+MD5)
randomNumberBased
バージョン4(ランダム)
nameBasedSHA1
バージョン5(名前ベース+SHA-1)
ubyte[16] data;
UUIDの16バイトを直接取得したり設定したりすると便利なことがある。 を直接取得したり設定したりすると便利なことがある。

注釈: UUIDはUUIDデータに対して16バイト表現を使用する。 RFC 4122はUUIDをビッグエンディアン形式の特別な構造体として定義している。 形式の特別な構造体として定義している。この16-ubyteは常にRFC 4122で定義されているビッグエンディアン構造と等しい。 RFC 4122で定義されている。

例:

auto rawData = uuid.data; //データを取得する
rawData[0] = 1; //修正する
uuid.data = rawData; //データを設定する
uuid.data[1] = 2; //直接修正する

pure nothrow @nogc @safe this(ref scope const ubyte[16] uuidData);

pure nothrow @nogc @safe this(const ubyte[16] uuidData);
16バイト表現のUUIDからUUID構造体を構築する。 からUUID構造体を構築する。
Examples:
enum ubyte[16] data = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
auto uuid = UUID(data);
enum ctfe = UUID(data);
writeln(uuid.data); // data
writeln(ctfe.data); // data
pure @safe this(T...)(T uuidData)
if (uuidData.length == 16 && allSatisfy!(isIntegral, T));
UUIDの16バイト表現からUUID構造体を構築する。 からUUID構造体を構築する。可変長コンストラクタにより、よりシンプルな構文が可能になる。 正確に16ubyteを渡す必要がある。
Examples:
auto tmp = UUID(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
assert(tmp.data == cast(ubyte[16])[0,1,2,3,4,5,6,7,8,9,10,11,
    12,13,14,15]);
this(T)(in T[] uuid)
if (isSomeChar!T);
UUIDを正規の文字列形式から解析する。UUIDの正規形は次のようになる。 は次のようになる:8ab3060e-2cba-4f23-b74c-b52db3bdfb46
Throws:
UUIDParsingException入力が無効な場合

CTFE この関数は CTFE コードでサポートされている。この関数はCTFEコードでサポートされている。 コンパイル時に解析された不正なUUIDによって引き起こされるエラーメッセージは、不可解なものである可能性がある、 しかし、エラーは コンパイル時に検出され報告される。

注釈:これは厳密なパーサーである。 これは厳密なパーサーである。上記のパターンのみを受け付ける。 先頭や末尾の文字はサポートしない。また 16進数に使われる文字しか受け付けない。 ハイフンがなければならない。

より厳密でないパーサーについては parseUUID

Examples:
auto id = UUID("8AB3060E-2cba-4f23-b74c-b52db3bdfb46");
assert(id.data == [138, 179, 6, 14, 44, 186, 79, 35, 183, 76,
   181, 45, 179, 189, 251, 70]);
writeln(id.toString()); // "8ab3060e-2cba-4f23-b74c-b52db3bdfb46"

//CTFEでは、例えばUUIDリテラルとしても使用できる:
enum ctfeID = UUID("8ab3060e-2cba-4f23-b74c-b52db3bdfb46");
//ここでの解析はコンパイル時に行われ、実行時のオーバーヘッドはない!
const pure nothrow @nogc @property @trusted bool empty();
UUIDが以下の場合にのみ真を返す。 to {00000000-0000-0000-0000-000000000000}
Examples:
UUID id;
assert(id.empty);
id = UUID("00000000-0000-0000-0000-000000000001");
assert(!id.empty);
const pure nothrow @nogc @property @safe Variant variant();
RFC 4122はUUIDの異なる内部データレイアウトを定義している。 このUUIDが使用しているフォーマットを返す。

注釈: これを std.variant.Variant. このプロパティの型は`std.uuid.UUID.Variant` である。

Examples:
assert(UUID("8ab3060e-2cba-4f23-b74c-b52db3bdfb46").variant
   == UUID.Variant.rfc4122);
const pure nothrow @nogc @property @safe Version uuidVersion();
RFC 4122は異なるUUIDバージョンを定義している。バージョンは 例えば、バージョン4のUUIDは乱数から、バージョン3のUUIDは名前のMD5ハッシュから生成される。 は乱数から、バージョン3のUUIDは名前のMD5ハッシュから生成された。 このUUIDが使用しているバージョンを返す。
Examples:
assert(UUID("8ab3060e-2cba-4f23-b74c-b52db3bdfb46").uuidVersion
    == UUID.Version.randomNumberBased);
pure nothrow @nogc @safe void swap(ref UUID rhs);
このUUIDのデータとrhsのデータを入れ替える。
Examples:
immutable ubyte[16] data = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
UUID u1;
UUID u2 = UUID(data);
u1.swap(u2);

writeln(u1); // UUID(data)
writeln(u2); // UUID.init
const pure nothrow @nogc @safe bool opEquals(const UUID s);

const pure nothrow @nogc @safe bool opEquals(ref scope const UUID s);

const pure nothrow @nogc @safe int opCmp(const UUID s);

const pure nothrow @nogc @safe int opCmp(ref scope const UUID s);

pure nothrow @nogc @safe UUID opAssign(const UUID s);

pure nothrow @nogc @safe UUID opAssign(ref scope const UUID s);

const pure nothrow @nogc @safe size_t toHash();
標準的な数値演算子はすべて に対して定義されている。
Examples:
// UUIDを比較する
writeln(UUID("00000000-0000-0000-0000-000000000000")); // UUID.init

//連想配列のUUID:
int[UUID] test = [UUID("8a94f585-d180-44f7-8929-6fca0189c7d0") : 1,
    UUID("7c351fd4-b860-4ee3-bbdc-7f79f3dfb00a") : 2,
    UUID("9ac0a4e5-10ee-493a-86fc-d29eeb82ecc1") : 3];

writeln(test[UUID("9ac0a4e5-10ee-493a-86fc-d29eeb82ecc1")]); // 3

//UUIDはソートできる:
import std.algorithm;
UUID[] ids = [UUID("8a94f585-d180-44f7-8929-6fca0189c7d0"),
              UUID("7c351fd4-b860-4ee3-bbdc-7f79f3dfb00a"),
              UUID("9ac0a4e5-10ee-493a-86fc-d29eeb82ecc1")];
sort(ids);
const void toString(Writer)(scope Writer sink);
UUIDを正規形式のASCII文字列として sinkにASCII文字列として書き込む、 これは、"xxxxxxxx-xxxxx-xxxxx-xxxxx-xxxxxxxxx "という形式で36文字である。
Parameters:
Writer sink 少なくとも36エントリーの長さのOutputRangeまたは書き込み可能な配列
const pure nothrow @trusted string toString();
UUIDを正規形式の文字列として返す。
Examples:
immutable str = "8ab3060e-2cba-4f23-b74c-b52db3bdfb46";
auto id = UUID(str);
writeln(id.toString()); // str
pure nothrow @nogc @safe UUID md5UUID(const(char[]) name, const UUID namespace = UUID.init);

pure nothrow @nogc @safe UUID md5UUID(const(ubyte[]) data, const UUID namespace = UUID.init);
この関数は、名前空間UUIDと名前から名前ベース(バージョン3)のUUIDを生成する。 名前空間UUIDが渡されなかった場合、空のUUIDUUID.init が使用される。

注釈 デフォルトの名前空間(dnsNamespaceこのモジュールで定義されている を使うべきである。

RFC4122は、新しいアプリケーションではバージョン3のUUID(MD5)ではなく、バージョン5のUUID(SHA-1)を使うことを推奨している。 UUID(MD5)の代わりにバージョン5のUUID(SHA-1)を使うことを推奨している。

CTFE CTFEはサポートされていない。

注釈: RFC4122は、名前からどのようにUUIDを生成すべきかについてあまり明確にしていない。 異なる実装が異なるUUIDを返す可能性がある。 を返す可能性がある。UTF-8文字列 std.uuid とバイト配列の実装は、Boostの実装と互換性がある。 std.uuid は、この関数への同じ入力がいつでも同じ出力を生成することを保証している。 これは特にエンディアンが関係ないことを意味する)。 は関係ない)。

注釈: この関数はwstringとdstringのオーバーロードを提供しない。 というのも、この関数はwstringとdstringのオーバーロードを提供しないからである。それは string、wstring、dstringの入力は同じ出力を持つべきだと主張することもできる、 文字列とwstringで異なる出力を生成するBoostとは互換性がない。 とは互換性がない。ubyte[]を使うことで、常にwstringとdstringを渡すことができる。 ubyte[]関数のオーバーロードを使うことで、wstringとdstringを渡すことは可能だ(ただしエンディアンの問題に注意!)。

Examples:
//デフォルトのUUID.init名前空間を使う
auto simpleID = md5UUID("test.uuid.any.string");

//名前ベースのidを名前空間として使う
auto namespace = md5UUID("my.app");
auto id = md5UUID("some-description", namespace);
pure nothrow @nogc @safe UUID sha1UUID(scope const(char)[] name, scope const UUID namespace = UUID.init);

pure nothrow @nogc @safe UUID sha1UUID(scope const(ubyte)[] data, scope const UUID namespace = UUID.init);
この関数は、名前空間UUIDと名前から名前ベース(バージョン5)のUUIDを生成する。 UUIDと名前から名前ベースのUUIDを生成する。 名前空間UUIDが渡されなかった場合、空のUUIDUUID.init が使用される。

注釈 デフォルトの名前空間(dnsNamespaceこのモジュールで定義されている を使うべきである。

CTFE CTFEはサポートされていない。

注釈: RFC4122は、名前からどのようにUUIDを生成すべきかについてあまり明確にしていない。 異なる実装が異なるUUIDを返す可能性がある。 を返す可能性がある。UTF-8文字列 std.uuid とバイト配列の実装は、Boostの実装と互換性がある。 std.uuid は、この関数への同じ入力がいつでも同じ出力を生成することを保証している。 これは特にエンディアンが関係ないことを意味する)。 は関係ない)。

注釈: この関数はwstringとdstringのオーバーロードを提供しない。 というのも、この関数はwstringとdstringのオーバーロードを提供しないからである。それは string、wstring、dstringの入力は同じ出力を持つべきだと主張することもできる、 文字列とwstringで異なる出力を生成するBoostとは互換性がない。 とは互換性がない。ubyte[]を使うことで、常にwstringとdstringを渡すことができる。 ubyte[]関数のオーバーロードを使うことで、wstringとdstringを渡すことは可能だ(ただしエンディアンの問題に注意!)。

Examples:
//デフォルトのUUID.init名前空間を使う
auto simpleID = sha1UUID("test.uuid.any.string");

//名前ベースのidを名前空間として使う
auto namespace = sha1UUID("my.app");
auto id = sha1UUID("some-description", namespace);
nothrow @nogc @safe UUID randomUUID();

UUID randomUUID(RNG)(ref RNG randomGen)
if (isInputRange!RNG && isIntegral!(ElementType!RNG));
この関数は、乱数発生器から乱数ベースのUUIDを生成する。 を生成する。
この関数はコンパイル時にはサポートされていない。
Parameters:
RNG randomGen 一様RNG
Examples:
import std.random : Xorshift192, unpredictableSeed;

//単純な呼び出し
auto uuid = randomUUID();

//カスタムRNGを提供する。手動でシードする必要がある。
Xorshift192 gen;

gen.seed(unpredictableSeed);
auto uuid3 = randomUUID(gen);
UUID parseUUID(T)(T uuidString)
if (isSomeString!T);

UUID parseUUID(Range)(ref Range uuidRange)
if (isInputRange!Range && isSomeChar!(ElementType!Range));
これは、UUIDコンストラクタで使用されるパーサーと比べると、それほど厳密なパーサーではない。 UUIDコンストラクタで使われるパーサーと比べると、それほど厳密なパーサーではない。これは以下のルールを強制する:
  • 16進数は常に2つの16進数([0-9a-fA-F])である。
  • そのようなペアが入力に16個正確に存在しなければならない。
  • 2つの16進数のペアの間にはダッシュを1つだけ入れる。
  • 16個の16進数ペアを囲む複数の文字があってもよい、 これらの文字が[0-9a-fA-F]を含まない限り、である。

注釈 ほとんどのパーサーと同様、引数を消費する。つまり

string s = "8AB3060E-2CBA-4F23-b74c-B52Db3BDFB46";
parseUUID(s);
assert(s == "");

Throws:
UUIDParsingException入力が無効な場合

CTFE この関数は CTFE コードでサポートされている。コンパイル時に解析された不正なUUIDに起因するエラーメッセージは不可解である。 コンパイル時に解析される不正なUUIDによって引き起こされるエラーメッセージは不可解である、 しかし、エラーはコンパイル時に検出され、報告される。

Examples:
auto id = parseUUID("8AB3060E-2CBA-4F23-b74c-B52Db3BDFB46");
//ダッシュなし
id = parseUUID("8ab3060e2cba4f23b74cb52db3bdfb46");
//異なる位置のダッシュ
id = parseUUID("8a-b3-06-0e2cba4f23b74c-b52db3bdfb-46");
//先行/後続文字
id = parseUUID("{8ab3060e-2cba-4f23-b74c-b52db3bdfb46}");
//unicode
id = parseUUID("ü8ab3060e2cba4f23b74cb52db3bdfb46ü");
//複数の末尾/先頭文字
id = parseUUID("///8ab3060e2cba4f23b74cb52db3bdfb46||");

//CTFEでは、例えばUUIDリテラルとしても使用できる:
enum ctfeID = parseUUID("8ab3060e-2cba-4f23-b74c-b52db3bdfb46");
//ここでの解析はコンパイル時に行われ、実行時のオーバーヘッドはない!
enum UUID dnsNamespace;
RFC 4122のデフォルト名前空間
名前文字列は完全修飾ドメイン名である
enum UUID urlNamespace;
RFC 4122のデフォルト名前空間
名前文字列はURLである
enum UUID oidNamespace;
RFC 4122のデフォルトの名前空間
名前文字列がISO OIDである
enum UUID x500Namespace;
RFC 4122のデフォルトの名前空間
名前文字列はX.500 DN(DERまたはテキスト出力形式)である。
enum string uuidRegex;
テキストからUUIDを抽出するための正規表現文字列。
Examples:
import std.algorithm;
import std.regex;

string test = "Lorem ipsum dolor sit amet, consetetur "~
"6ba7b814-9dad-11d1-80b4-00c04fd430c8 sadipscing \n"~
"elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore \r\n"~
"magna aliquyam erat, sed diam voluptua. "~
"8ab3060e-2cba-4f23-b74c-b52db3bdfb46 At vero eos et accusam et "~
"justo duo dolores et ea rebum.";

auto r = regex(uuidRegex, "g");
UUID[] found;
foreach (c; match(test, r))
{
    found ~= UUID(c.hit);
}
assert(found == [
    UUID("6ba7b814-9dad-11d1-80b4-00c04fd430c8"),
    UUID("8ab3060e-2cba-4f23-b74c-b52db3bdfb46"),
]);
class UUIDParsingException: object.Exception;
この例外は、文字列からUUIDを解析する際にエラーが発生した場合にスローされる。 を文字列から解析する際にエラーが発生した場合にスローされる。
Examples:
import std.exception : collectException;

const inputUUID = "this-is-an-invalid-uuid";
auto ex = collectException!UUIDParsingException(UUID(inputUUID));
assert(ex !is null); // 例外がスローされたかチェックする
writeln(ex.input); // 入力UUID
writeln(ex.position); // 0
writeln(ex.reason); // UUIDParsingException.Reason.tooLittle
enum Reason: int;

Reason reason;
UUID文字列の解析に失敗した理由(わかっている場合)
unknown
tooLittle
渡された入力は正しいが、もっと多くの入力が期待されていた。
tooMuch
入力データが長すぎる(データの最初の部分が有効である保証はない)
invalidChar
無効な文字に遭遇した
string input;
パースされるはずだった元の入力文字列。
size_t position;
エラーが発生した入力文字列の位置。