.NET GUID にダッシュがあるのはなぜですか? GUID のほとんどの実装にダッシュがありますか、それとも Microsoft だけのものですか?
署名済み、
741ecf77-9c92-4435-8e6b-85975bd13452
技術的には、 GUIDに「ダッシュ」はありません。GUID は 128 ビットの値で、通常は次の方法で格納されます (ここでは構造を表すために C# を使用しています)。
public struct Guid
{
public ulong Data1;
public ushort Data2;
public ushort Data3;
public fixed byte Data4[8];
}
ダッシュは、GUIDの文字列表現です。
ダッシュはオプションであり、GUID の文字列表現では必須ではありません。
とは言っても、GUID の生成方法に関連して、ダッシュの配置場所に関する歴史的な理由がありますが、その歴史的なセマンティックはもはや適用されません。
UUID (Universally Unique Identifier) 仕様の初期バージョンでは、各データ要素に意味的な意味がありました。
{ time_low } – { time_mid } – { time_high_and_version } – { clock_seq_and_reserved clock_seq_low } – { node_id }
これらの要素は、時間 (時間ビット) および空間 (ホスト ビット) の一意性を提供するように設計されています。
2^1024 ランダム ビットのキースペースでの衝突の数学的確率は天文学的にありそうもないことが判明したため、UUID 仕様の後続のバージョンでは、セキュリティとプライバシーの理由から時間とホスト データが段階的に廃止されました。
意味を保持する唯一の要素は、バージョン ビットと予約済みビットです。
バージョン 3 UUID は、URI またはその他の識別名の MD5 ハッシュから派生します。
バージョン 4 はランダム データで生成され、現在、実際に目にする最も一般的な実装です。
バージョン 5 は、SHA1 ハッシュから派生しています。
ハイフンは RFC で UUID の ASCII 形式に指定されているため、個々のセクションが元の意味を保持していなくても、相互運用性が必要な場合はハイフンが必要です。
UUID は、base64 または ascii85 でエンコードされた文字列として格納されることもあり、バイナリ セーフではないトランスポートを介した転送用のスペースを節約します。RFC への準拠は必要ありません。
アスキー: 3F2504E0-4F89-11D3-9A0C-0305E82C3301 Base64: 7QDBkvCA1+B9K/U0vrQx1A Ascii85: 5:$Hj:Pf\4RLB9%kU\Lj
参考文献:
RFC4122 (特に UUID 形式の ABNF の説明については、3 ページを参照してください)
Wikipedia GUID UUID
さまざまな形式でガイドを入手できます。
c#を使用していると仮定します。
Guid guid = Guid.NewGuid();
Console.WriteLine(guid.ToString("N"))
63be6f7e4e564f0580229f958f492077
Console.WriteLine(guid.ToString("D"))
63be6f7e-4e56-4f05-8022-9f958f492077
Console.WriteLine(guid.ToString("B"))
{63be6f7e-4e56-4f05-8022-9f958f492077}
Console.WriteLine(guid.ToString("P"))
(63be6f7e-4e56-4f05-8022-9f958f492077)
ハイフンは、Guid のバイト構造を示します。
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
為に:
(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
おそらく、保存する前にそれらを取り除くことができます。少なくとも .NET では、Guid 型のコンストラクターは、ハイフンがまだ存在しているか削除されているかに関係なく、文字列表現から Guid 変数を初期化します。
それはただの便利です。
これは、電話番号、クレジット カード番号などと同じように、チャンキングの例です。
私が見たほぼすべての GUID の視覚的表現は、破線の形式を使用しています。目にははるかに簡単です。
.NETのGuid
クラスは、一連のさまざまな形式を認識します: 区切り記号としてのダッシュ、区切り記号なし、区切り記号としての括弧、区切り記号としての括弧、区切り記号なしなど
ハイフンは各数字を区切るために使用されます
E93416C5-9377-4A1D-8390-7E57D439C9E7
Hex digits Description
8 Data1
4 Data2
4 Data3
4 Initial two bytes from Data4
12 Remaining six bytes from Data4
それは便宜上のものです。GUID は 16 バイトで構成され、16 進テキスト表現で 32 文字を構成します。ハイフンがないと、GUID は人間が認識しにくくなり、ランダムな性質の 16 バイトの数値ではなく、GUID として認識されにくくなります。
GUID は実際には単なる数字です。ハイフンは、さまざまなコンポーネントがどのように分類されているかを示していますが、実際には数値の一部ではありません. これは IP アドレスのようなものです。32 ビットの数値を格納することも、ドットを含む文字列を格納することもできます。これらは同等です。
ハイフンは、値の一意性やランダム性にはまったく影響しません。これらは、GUID の定義からの単なる名残りであり、GUID を構成するデータの 4 つの異なる部分を視覚的に分離します。
GUID をどこかに保存する場合は、テキスト表現としてではなく、16 バイトの配列として保存します。多くのスペースを節約でき、ハイフンの問題は発生しません。