Подтвердить что ты не робот

Действительно простое сжатие коротких строк

Есть ли действительно простая техника сжатия строк длиной до 255 символов (да, я сжимаю URL)?

Меня не интересует сила сжатия - я ищу что-то, что работает очень хорошо и быстро реализуется. Я хотел бы сделать что-то более простое, чем SharpZipLib: что-то, что может быть реализовано с помощью нескольких коротких методов.

4b9b3361

Ответ 1

Я думаю, что ключевым вопросом здесь является "Почему вы хотите сжать URL-адреса?"

Попытка сократить длинные URL-адреса для адресной строки?

Лучше хранить исходный URL-адрес где-нибудь (база данных, текстовый файл...) вместе с хэш-кодом части, отличной от домена (MD5 в порядке). Затем вы можете получить простую страницу (или некоторый HTTPModule, если вы чувствуете себя кричащим), чтобы прочитать MD5 и найти реальный URL. Вот как работают TinyURL и другие.

Например:

http://mydomain.com/folder1/folder2/page1.aspx

Может быть закорочен на:

http://mydomain.com/2d4f1c8a

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

Сохранение большого количества URL-адресов в памяти или на диске?

Используйте встроенную библиотеку сжатия в System.IO.Compression или библиотеку ZLib, которая проста и невероятно хороша. Поскольку вы будете хранить двоичные данные, сжатый вывод будет точным как есть. Вам нужно распаковать его, чтобы использовать его в качестве URL-адреса.

Ответ 2

Как было предложено в принятом ответе, использование сжатия данных не работает, чтобы сократить URL-пути, которые уже довольно короткие.

DotNetZip имеет класс DeflateStream, который предоставляет статический (Shared in VB) CompressString. Это однострочный способ сжатия строки с использованием DEFLATE (RFC 1951). Реализация DEFLATE полностью совместима с System.IO.Compression.DeflateStream, но DotNetZip сжимается лучше. Вот как вы можете его использовать:

string[] orig = {
    "folder1/folder2/page1.aspx",
    "folderBB/folderAA/page2.aspx",
};
public void Run()
{
    foreach (string s in orig)
    {
        System.Console.WriteLine("original    : {0}", s);
        byte[] compressed = DeflateStream.CompressString(s);
        System.Console.WriteLine("compressed  : {0}", ByteArrayToHexString(compressed));
        string uncompressed = DeflateStream.UncompressString(compressed);
        System.Console.WriteLine("uncompressed: {0}\n", uncompressed);
    }
}

Используя этот код, вот мои результаты:

original    : folder1/folder2/page1.aspx
compressed  : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx

original    : folderBB/folderAA/page2.aspx
compressed  : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx

Таким образом, вы можете видеть, что "сжатый" массив байтов, представленный в шестнадцатеричном виде, длиннее исходного, примерно в 2 раза. Причина в том, что шестнадцатеричный байт на самом деле является 2 символами ASCII.

Вы можете немного компенсировать это, используя base-62 вместо base-16 (hex), чтобы представить номер. В этом случае a-z и A-Z также являются цифрами, что дает 0-9 (10) + a-z (+26) + A-Z (+26) = 62 общих разряда. Это значительно сократит выпуск. Я этого не пробовал. пока.


ИЗМЕНИТЬ
Хорошо, я протестировал кодировщик Base-62. Он сокращает шестнадцатеричную строку примерно на половину. Я решил, что это сократит его до 25% (62/16 = ~ 4). Но я думаю, что я что-то теряю с дискретизацией. В моих тестах итоговая строка с кодировкой base-62 примерно равна длине исходного URL. Таким образом, нет, использование сжатия, а затем кодирование base-62 по-прежнему не является хорошим подходом. вы действительно хотите хеш-значение.

Ответ 4

Какова ваша цель?

  • Более короткий URL? Попробуйте сократить URL-адреса, например http://tinyurl.com/ или http://is.gd/
  • Место для хранения? Проверьте System.IO.Compression. (Или SharpZipLib)

Ответ 5

Я бы начал с попытки использовать одну из существующих (свободных или открытых исходных) zip-библиотек, например. http://www.icsharpcode.net/OpenSource/SharpZipLib/

Zip должен хорошо работать для текстовых строк, и я не уверен, что стоит реализовать алгоритм сжатия yourserlf....

Ответ 6

Вы пробовали использовать gzip?

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

Ответ 7

Библиотека с открытым исходным кодом SharpZipLib прост в использовании и предоставит вам инструменты сжатия

Ответ 8

Вы можете использовать алгоритм дефляции напрямую, без каких-либо контрольных сумм или нижних колонтитулов заголовков, как описано в этом вопросе: Python: надуть и дефлатировать реализации

Это сокращает URL-адрес 4100 символов до 1270 символов base64, в моем тесте, позволяя ему соответствовать пределу IE 2000.

И вот пример 4000-символьный URL, который не может быть разрешен с помощью хеш-таблицы, поскольку апплет может существовать на любом сервер.