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

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

Подпись,

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

13 ответов

Решение

Технически, в 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 (универсального уникального идентификатора) каждый из элементов данных имел семантическое значение:

{ 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% к U\Lj

Рекомендации:
RFC4122 (см. Стр. 3 специально для описания ABNF формата UUID)
Википедия 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 из ее строкового представления независимо от того, есть ли еще дефисы там или удалены.

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

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

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

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

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

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

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

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

Гипс совершенно не влияет на уникальность или случайность значения. Они просто являются пережитком определения GUID и визуально разделяют четыре отдельных части данных, которые составляют GUID.

GUID на самом деле просто число. Дефисы показывают, как различные компоненты разбиты, но на самом деле они не являются частью числа. Это как IP-адрес - вы можете хранить 32-битное число или строку с точками, они эквивалентны.

Если вы хотите сохранить guid где-нибудь, то сохраните его как массив из 16 байтов, а не как его текстовое представление. Вы сэкономите много места, и вопрос с дефисами не возникнет.

Другие вопросы по тегам