Как кодировать большое число (в URL)? - PullRequest
4 голосов
/ 31 января 2009

Довольно часто приходится кодировать большое (например, 128 или 160 бит) число в URL. Например, многие веб-приложения используют md5 (random ()) для идентификаторов UUID.

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

Но очевидно, что шестнадцатеричное кодирование не очень жесткое. Какие есть другие подходы, которые хорошо вписываются в URL?

Ответы [ 5 ]

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

Я бы использовал «URL и имя файла безопасно» Base 64 Alphabet.

База 64 использует два набора символов.

Data: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
URLs: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

Чтобы использовать основание 64, вам необходимо добавить значение, кратное 3 байтам (24 бита), а затем разделить эти 24 бита на 4 6-битных байта. Каждое 6-битное значение ищется по позиции в приведенной выше строке.

Если все пойдет хорошо, ваше окончательное значение base64 всегда будет кратно 4 символам и декодировано до кратного 3 (8 бит) байтов.

В зависимости от используемого вами языка, многие из них имеют встроенные функции кодирования и декодирования.

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

Вы можете сделать еще лучше с кодировкой base64-url (a-z, A-Z, 0-9, - и _ [см. RFC4648, раздел 5]). RFC4648 охватывает несколько различных методов кодирования (base16, base32 и base64) и несколько вариантов. Кроме того, в зависимости от разреженности битов, которые установлены в числе, вы можете предположительно запустить его через gzip и затем использовать один из описанных методов кодирования. Конечно, использование gzip действительно зависит от того, насколько велико число, которое вы собираетесь кодировать.

2 голосов
/ 31 января 2009

Если вам это нужно, вы можете использовать кодировку base-36 (от 0 до Z).

0 голосов
/ 29 октября 2010

Используя подсказку base36, я сейчас использую что-то вроде этого (в Python):

>>> str(base64.b32encode(uuid.uuid1().bytes).rstrip('='))
'MTB2ONDSL3YWJN3CA6XIG7O4HM'
0 голосов
/ 31 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...