Сколько символов в GUID?

82

Сколько символов в GUID при использовании кодировки ASCII?

Меня интересует стиль Microsoft, который включает фигурные скобки и тире.

Джим Графс
источник
2
Все они одинаковой длины. Если вы посчитаете символы за один, вы узнаете их длину.
Грег Хьюгилл, 03
1
@Greg - Это очень плохое предположение, если вы не понимаете, что длина не будет меняться.
Адам Дэвис,
8
Если бы длина менялась, то этот вопрос был бы похож на вопрос: «Какова длина веревки?» Вместо этого он спрашивает «сколько яиц в дюжине?»
Грег Хьюгилл, 03
8
Когда я искал этот вопрос в Google, каждый ответ просто указывал на определение guid. Голосуйте против меня, если хотите, но я просто пытаюсь упростить поиск ответа на этот конкретный вопрос, без необходимости подсчета для будущих спрашивающих.
Джим Графс,
2
Я понимаю, о чем вы говорите, но если кто-то только что познакомился с NewDataX, вопрос о длине актуален, и вы не можете предполагать, что то, что вы видели, является примером любого другого NewDataX, пока вы не поймете, что такое NewDataX.
Адам Дэвис,

Ответы:

130

Из MSDN :

GUID - это 128-битное значение, состоящее из одной группы из 8 шестнадцатеричных цифр, за которыми следуют три группы по 4 шестнадцатеричных цифры каждая, за которыми следует одна группа из 12 шестнадцатеричных цифр. В следующем примере GUID показаны группы шестнадцатеричных цифр в GUID: 6B29FC40-CA47-1067-B31D-00DD010662DA

Из Википедии :

Часто фигурные скобки добавляются, чтобы заключить вышеуказанный формат как таковой:

{3F2504E0-4F89-11D3-9A0C-0305E82C3301}

Итак, всего 38 символов в типичной шестнадцатеричной кодировке с фигурными скобками.

-Адам

Адам Дэвис
источник
@magnifico - см. последний абзац этого ответа: «Итак, всего 38 символов в типичной шестнадцатеричной кодировке с фигурными скобками».
Randolpho
1
Не нужно бороться с magnifico - он задал вопрос, он сам решает, кто дал наиболее подходящий ответ. Я уверен, что у него есть причины предпочесть другой ответ этому.
Адам Дэвис,
@Beska, потому что для этого нужно Stack Overflow. Вместо того, чтобы раздавать рыбу одному человеку, раздайте одну и ту же рыбу миллиону людей.
bugloaf
@bugloaf Хм. Я подозреваю, что оба моих комментария относились к чему-то, что было удалено, поскольку они не имели смысла в текущем контексте ... и первый был очень конкретным ответом на что-то исчезнувшее. Я избавился от них. (В текущем контексте это выглядело так, как будто я возражал против ответа, который является хорошим ответом, который мне не имеет смысла, и который вы правильно вызывали.)
Беска
@AdamDavis Я считаю 32, а не 38. edit: вы должны считать фигурные скобки и тире, неважно.
KyleM
32

TL; DR: Нет.

Как заявил Адам Дэвис, стиль Microsoft - это кодировка HEX (с фигурными скобками и тире, чтобы сделать ее более читаемой), которая может отображаться с использованием подмножества символов ASCII (0–9 и AF), но это не является конкретно кодировкой ASCII.

Я думаю, важно помнить, что стиль отображения GUID в Microsoft - это всего лишь представление GUID, которое на самом деле является 16-байтовым целым значением (как заявил Майкл Трауш).

Вы также можете представить его другими, более компактными способами, преобразовав байты в другой набор символов (например, ASCII).

Теоретически вы можете отображать каждый байт как расширенный символ ASCII (255 символов), что позволит вам сохранить GUID в виде строки длиной 16 символов.

Это было бы не очень удобно для чтения, потому что оно будет включать символы пробела (CR, пробел, табуляция и т.д.) и другие специальные символы, поэтому это будет иметь смысл только в том случае, если вы хотите эффективно сохранить GUID в формате символов, нечитаемых человеком , например, в базе данных, которая изначально не поддерживает GUID или быстрое сопоставление небольших двоичных значений: http://en.wikipedia.org/wiki/Extended_ASCII

ИМХО, самый читаемый способ отобразить более компактный GUID - это использовать кодировку Base64, которая позволяет сохранить его в строке длиной 22 символа, и это будет выглядеть так:

7v26IM9P2kmVepd7ZxuXyQ==

Но, как утверждает Джефф Этвуд на своем сайте, вы также можете вставить GUID в закодированную строку ASCII85 из 20 символов:

[Rb*hlkkXVW+q4s(YSF0

Для получения дополнительных сведений см. Http://www.codinghorror.com/blog/2005/10/equipping-our-ascii-armor.html.

Wiebe Tijsma
источник
3
Я разместил кодировщик / декодер Ascii-85 на C # здесь: stackoverflow.com/questions/2827627/…
sheikhjabootie
1
Если бы только у этого ответа было большое и жирное «Нет» вверху, чтобы заманить читателей и действовать как TL; DR. ;)
jpmc26 09
14

Как упомянул Адам из цитаты MSDN, UUID - это 128-битные значения. Это означает, что для хранения значения им требуется 16 байт ОЗУ. Текстовое представление займет 32 байта (два байта на каждый байт) плюс 4 дефиса плюс две скобки, если вы хотите их включить; это составляет 38 байт.

Просто имейте в виду, что если вы предоставляете UUID пользователям своего программного обеспечения, они могут предоставить UUID с скобками или без них. Если вы храните значение где угодно, лучше всего сохранить его как 16-байтовое двоичное представление. Если вы взаимодействуете с другими реализациями UUID, вы можете использовать основной текстовый формат для взаимодействия, поскольку разные реализации по-разному изменяют порядок байтов при сохранении двоичного значения UUID.

Майкл Трауш
источник
6

Длина зависит от кодировки. Вы можете получить стандартную кодировку и длину с помощью этого фрагмента:

public void Main() 
{
    var guid = Guid.Empty;
    Write(guid, "N"); // 32 characters
    Write(guid, "D"); // 36 characters (default)
    Write(guid, "B"); // 38 characters
    Write(guid, "P"); // 38 characters
    Write(guid, "X"); // 68 characters
}    

private void Write(Guid guid, string format) 
{
    var guidString = guid.ToString(format);
    Console.WriteLine("{0}: {1} ({2} characters)", format, guidString, guidString.Length);
}

Подробнее см. Метод Guid.ToString :

MovGP0
источник