Кто подскажет компактный енкодинг для GUID?
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.06.05 07:34
Оценка:
Задача: передавать GUID (иногда не один) в URL.
Можно, конечно, использовать дефолтную кодировку. Но это не очень удобно, т.к. она длиннее, чем иногда адрес страницы.
В связи с этим, возникает вопрос: как его закодировать? При этом пользоваться можно только тем подмножеством символов, которое допустимо в урле.
Может быть, существует готовый велосипед?
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Кто подскажет компактный енкодинг для GUID?
От: WeCom Беларусь  
Дата: 03.06.05 07:40
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>В связи с этим, возникает вопрос: как его закодировать? При этом пользоваться можно только тем подмножеством символов, которое допустимо в урле.


А не подойдет ли base64 кодировка бинарного 128-ми битного представления GUIDа?
Re[2]: Кто подскажет компактный енкодинг для GUID?
От: conraddk Россия  
Дата: 03.06.05 08:35
Оценка:
Здравствуйте, WeCom, Вы писали:

WC>Здравствуйте, Sinclair, Вы писали:


S>>В связи с этим, возникает вопрос: как его закодировать? При этом пользоваться можно только тем подмножеством символов, которое допустимо в урле.


WC>А не подойдет ли base64 кодировка бинарного 128-ми битного представления GUIDа?


Только желательно заменить "/" и "=", присутствующие в алфавите base64 на что-нибудь другое, например, "-" и "_" или "(" и ")" (RFC 2396, RFC 1738).
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Все на свете должно происходить медленно и неправильно...
Re[3]: Кто подскажет компактный енкодинг для GUID?
От: _JoKe_  
Дата: 03.06.05 09:56
Оценка:
S>>>В связи с этим, возникает вопрос: как его закодировать? При этом пользоваться можно только тем подмножеством символов, которое допустимо в урле.
WC>>А не подойдет ли base64 кодировка бинарного 128-ми битного представления GUIDа?
C>Только желательно заменить "/" и "=", присутствующие в алфавите base64 на что-нибудь другое, например, "-" и "_" или "(" и ")" (RFC 2396, RFC 1738).

нет там "/" есть [A-Za-z0-9+=]
на "_" лучше не заменять... ASP.NET использует этот символ для разделения INamingContainer-ов и порой очень неадекватно реагирует на появление его в URL (выгружает домен)
... << RSDN@Home 1.1.4 @@subversion >>
Re[4]: Кто подскажет компактный енкодинг для GUID?
От: conraddk Россия  
Дата: 03.06.05 10:39
Оценка:
Здравствуйте, _JoKe_, Вы писали:

_JK>нет там "/" есть [A-Za-z0-9+=]

Есть. Символ 63. Буквы и цифры дают 26*2+10=52 символа, "=" нужен для выравнивания, так что еще два требуются
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Все на свете должно происходить медленно и неправильно...
Re[5]: Кто подскажет компактный енкодинг для GUID?
От: conraddk Россия  
Дата: 03.06.05 10:55
Оценка:
_JK>>нет там "/" есть [A-Za-z0-9+=]
C>Есть. Символ 63. Буквы и цифры дают 26*2+10=52 символа, "=" нужен для выравнивания, так что еще два требуются
62, конечно же.
Вообще не рекомендуется (это следствие из тех RFC, что я упоминал раньше) использовать [+/=] в URL. Так что заменяем их на, например, [()-], если подчеркивание тоже нехорошо.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Все на свете должно происходить медленно и неправильно...
Re[5]: Кто подскажет компактный енкодинг для GUID?
От: _JoKe_  
Дата: 03.06.05 14:33
Оценка:
_JK>>нет там "/" есть [A-Za-z0-9+=]
C>Есть. Символ 63. Буквы и цифры дают 26*2+10=52 символа, "=" нужен для выравнивания, так что еще два требуются

был неправ
... << RSDN@Home 1.1.4 @@subversion >>
Re[2]: Кто подскажет компактный енкодинг для GUID?
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.06.05 12:37
Оценка:
Здравствуйте, WeCom, Вы писали:
WC>А не подойдет ли base64 кодировка бинарного 128-ми битного представления GUIDа?
Идея хороша. Вот полный список url-safe символов (см. RFC1738):

Thus, only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used for their reserved purposes may be used unencoded within a URL.

Зарезервированные символы нас не интересуют, т.к в параметре запроса их быть не должно. Итого всего 52 (alpha) + 10 (numeric) + 11(special) = 73 символа. Несложно убедиться, что длина Guid в 73-ричном представлении равна примерно 20.67909983. А в 64-ричном представлении — 21.333333 символа. Таким образом, выбирая более короткий алфавит, мы потеряем один символ, зато существенно упростим алгоритм кодирования.

Можно ли сделать представление GUID еще более компактным?
На первый взгляд, нельзя. Однако, если обратиться к первоисточникам, можно обнаружить, что не все 128-битные последовательности могут считаться GUID.
1. Variant.
Восьмой байт GUID содержит в себе вариант этой структуры. Вариант закодирован положением первого 0; при этом современные реализации используют 10xxxxxxx, т.е. 2 из 8 бит фиксированы. Таким образом, если нам известен вариант GUID, который будет использован, то можно сэкономить 2 бита.
2. Version.
Четыре старших бита поля timestamp-hi идентифицируют версию алгоритма, использованного для генерации GUID. Во-первых, сейчас специфицированы только 5 версий (из 16 возможных), что позволяет сэкономить 1 бит; фиксация номера версии позволяет сэкономить ажно 4 бита

Таким образом, не углубляясь в исследование возможных/невозможных комбинаций timestamp, MAC адресов и т.д, мы сокращаем длину передаваемых данных до 122 бит, или ровно на один 64-битный символ.
Наш идентификатор будет строкой длиной в 21 символ ASCII.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.