Почему в GUID .NET есть дефисы?
Вопрос
Почему в GUID .NET есть дефисы?Есть ли в большинстве реализаций GUID тире или это особенность Microsoft?
Подписано,
741ecf77-9c92-4435-8e6b-85975bd13452
Решение
Технически в букве нет «тире». ГУИД.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 постепенно исключили время и данные хоста по соображениям безопасности и конфиденциальности.
Единственные элементы, которые сохраняют какое-либо значение, — это биты версии и зарезервированные биты.
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)
Википедия ГУИД UUID
Дефисы обозначают байтовую структуру Guid.
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
Для:
(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX)
Вероятно, вы можете удалить их перед сохранением.По крайней мере, в .NET конструктор типа Guid инициализирует переменную Guid из ее строкового представления независимо от того, присутствуют ли дефисы или они удалены.
Вы можете получить руководство в различных форматах.
Предполагая, что вы используете С#:
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
класс .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-байтовые числа.
Если вы хотите где-то хранить руководство, храните его как массив из 16 байт, а не как его текстовое представление.Вы сэкономите много места, и вопрос о дефисах не возникнет.
GUID на самом деле — это просто число.Дефисы показывают, как разбиты различные компоненты, но на самом деле они не являются частью числа.Это как IP-адрес — вы можете хранить 32-битное число или строку с точками, они эквивалентны.
Дефисы совершенно не влияют на уникальность или случайность значения.Они являются просто пережитком определения GUID и визуально разделяют четыре отдельные части данных, составляющих GUID.