Почему в .NET GUID есть тире? - PullRequest
       62

Почему в .NET GUID есть тире?

49 голосов
/ 06 января 2009

Почему в .NET GUID есть тире? Есть ли черты в большинстве реализаций GUID или это просто вещь от Microsoft?

Подпись

741ecf77-9c92-4435-8e6b-85975bd13452

Ответы [ 13 ]

57 голосов
/ 06 января 2009

Технически, нет никаких «черточек» в GUID . GUID - это 128-битное значение, которое обычно хранится следующим образом (здесь используется C # для представления структуры):

public struct Guid
{
  public ulong Data1;
  public ushort Data2;
  public ushort Data3;
  public fixed byte Data4[8];
}

Тире находятся в строковом представлении GUID.

Тире необязательны и не требуются в строковом представлении GUID.

Тем не менее, есть исторические причины, по которым расположение штрихов равно , связанные с тем, как были сгенерированы GUID, но эта историческая семантика больше не применяется.

35 голосов
/ 24 августа 2010

В исходной версии спецификации UUID (универсальный уникальный идентификатор) каждый из элементов данных имел семантическое значение:

{ time_low } - { time_mid } - { time_high_and_version } - { clock_seq_and_reserved clock_seq_low } - { node_id }

Эти элементы были разработаны для обеспечения временной (биты времени) и пространственной (биты хоста) уникальности.

История версий

Поскольку математическая вероятность коллизий в пространстве ключей из 2 ^ 1024 случайных битов оказалась астрономически маловероятной, последующие версии спецификации UUID постепенно сокращают время и данные хоста из соображений безопасности и конфиденциальности.

Единственными элементами, которые сохраняют какое-либо значение, являются биты версии и зарезервированные биты.

UUID версии 3 получены из хэша MD5 URI или другого отличительного имени.

Версия 4 генерируется со случайными данными и в настоящее время является наиболее распространенной реализацией, которую вы видите в дикой природе.

Версия 5 получена из хэша SHA1.

Форматы хранения

Так как дефисы указаны для форматирования UUID в ASCII в RFC, даже если отдельные разделы больше не сохраняют свое первоначальное значение, они все еще необходимы, если вам нужна совместимость.

UUID также иногда хранятся в виде строки в кодировке base64 или ascii85, чтобы сэкономить место для передачи по транспортам, которые не являются бинарно-безопасными, и соблюдение RFC не требуется.

Ascii:   3F2504E0-4F89-11D3-9A0C-0305E82C3301
Base64:  7QDBkvCA1+B9K/U0vrQx1A
Ascii85: 5:$Hj:Pf\4RLB9%kU\Lj

Рекомендации:
RFC4122 (см. Стр. 3 для описания ABNF формата UUID)
Википедия GUID UUID

13 голосов
/ 24 августа 2010

Дефисы обозначают байтовую структуру Guid.

typedef struct _GUID 
{  
   DWORD Data1;  
   WORD Data2;  
   WORD Data3;  
   BYTE Data4[8];
} GUID;

Для:

(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)

Вы можете удалить их перед сохранением. По крайней мере, в .NET конструктор типа Guid будет инициализировать переменную Guid из ее строкового представления независимо от того, есть ли дефисы там еще или удалены.

11 голосов
/ 24 августа 2010

Вы можете получить свой гид в различных форматах.

Предполагается, что вы используете 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)

9 голосов
/ 06 января 2009

Это просто удобство.

http://en.wikipedia.org/wiki/GUID

6 голосов
/ 06 января 2009

Это пример разбиения на блоки, например, номера телефонов, номера кредитных карт и т. Д.

Вот хорошая статья в Википедии об этом.

4 голосов
/ 06 января 2009

Почти каждое визуальное представление направляющей, которое я видел, использует пунктирный формат. Это намного проще для глаз.

3 голосов
/ 06 января 2009

. *. 1001 * класс .NET распознает множество различных форматов: дефисы как разделители, без разделителей, скобки как разделители, круглые скобки как разделители, без разделителей и т.д.

2 голосов
/ 24 августа 2010

Дефисы используются для разделения каждого числа

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
1 голос
/ 24 августа 2010

Это просто для удобства. GUID состоит из 16 байтов, что составляет 32 символа в шестнадцатеричном текстовом представлении. Без дефисов GUID труднее воспринимать людьми, и его труднее распознать как GUID, а не как 16-байтовые числа произвольной природы.

...