Как реализовать сокращение URL без потерь - PullRequest
2 голосов
/ 19 августа 2011

Во-первых, немного контекста:

Я пытаюсь реализовать сокращение URL на моем собственном сервере (в C, если это имеет значение).Цель состоит в том, чтобы избежать длинных URL-адресов при возможности восстановления контекста из сокращенного URL-адреса.

В настоящее время у меня есть реализация, которая создает сеанс на сервере , идентифицируемый определенным идентификатором.Это работает, но потребляет память на сервере (и нежелательно, так как это встроенный сервер с ограниченными ресурсами, а основное назначение устройства - не предоставление веб-страниц, а выполнение других интересных вещей).

Другой вариантбудет использовать cookie или HTML5 webstorage для хранения информации о сеансе в клиенте.

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

Первой мыслью было использование Base64 - кодирование для объединения всех параметров в один, но это приводит к еще большему URL.

В настоящее время я думаю о сжатии параметров URL (используя некоторый алгоритм сжатия, такой как zip)., bz2 , ...), выполните Base64-кодировку для этого сжатого двоичного двоичного объекта и используйте эту информацию в качестве контекста.Когда я получу параметр, я смогу выполнить декодирование Base64, распаковать результат и получить исходный URL.

Вопрос: существует ли какая-либо другая возможность, что яЯ упускаю из виду, что я мог бы использовать для сжатия без потерь большой список параметров URL в один меньший ?


Обновление:
Послекомментарии из home , я понял, что упустил из виду, что сжатие само по себе добавляет некоторые накладные расходы к сжатым данным, делая сжатые данные даже больше, чем исходные данные, из-за накладных расходов, которые, например, добавляет zipping к содержанию.
Итак (как home заявляет в своих комментариях), я начинаю думать, что сжатие всего списка параметров URL действительно полезно, только если параметры превышают определенную длину, потому чтов противном случае я мог бы получить еще больший URL, чем раньше.

1 Ответ

2 голосов
/ 22 августа 2011

Вы всегда можете свернуть свое собственное сжатие. Если вы просто примените некоторую кодировку huffman , результат всегда будет меньше (но тогда кодирование с помощью base64 будет немного расти, поэтому суммарный эффект может быть не оптимальным).

Я использую собственную стратегию сжатия во встроенном проекте, с которым я впервые использую lzjb (производная lempel ziv, перейдите по ссылке для получения исходного кода, действительно точная реализация (из открытого Solaris) ) с последующим кодированием Хаффмана сжатого результата.

Алгоритм lzjb работает не очень хорошо на очень коротких входах, хотя (~ 16 байт, в этом случае я оставляю его без сжатия).

...