Nano Hash - криптовалюты, майнинг, программирование

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

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

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

28.07.2009

  • Почему, безусловно, хороший ответ. Однако, как примечание, кодирование Хаффмана отлично подходит для простого сжатия текста без необходимости прибегать к внешним библиотекам и сжатию LZW. 28.07.2009
  • возможный дубликат лучший алгоритм сжатия для коротких текстовых строк 29.01.2010
  • Это не ответ на вопрос. Что делать, если вам негде хранить хеш-таблицу? 29.07.2010

Ответы:


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-адреса.

28.07.2009
  • @endolith - Дело в том, что сжатие строк вам здесь не поможет, только свяжет их с хешем или чем-то подобным. См. Ответ Cheeso для получения информации о реальных примерах сжатия более длинных и столь же длинных в оригинале при преобразовании обратно в действительные URL-адреса. Всегда есть где хранить хеш. Жестко закодируйте его в свой код перенаправления URL, если вам действительно негде его хранить! 19.10.2010
  • Не всегда есть где хранить хеш-таблицу, и это не всегда удлиняет URL-адрес. Например, en.wikipedia.org/wiki/Data_URI_scheme 20.10.2010
  • URI данных не используется для сжатия и не имеет ничего общего с сокращением URL-адресов. На самом деле URI данных предназначен для встраивания данных в веб-страницы и использует base64, что, если вы прочитаете ответ Chesso, вы увидите, что он намного длиннее. В каком случае у вас не было бы места для хранения ссылок на URL / хэш-код? Если у вас есть форма сжатия, которая сокращает URL-адрес, но при этом остается действующим URL-адресом, опубликуйте его в качестве ответа, я уверен, что сообщество выиграет. 20.10.2010
  • Использовать шестнадцатеричный формат довольно глупо, это совсем не плотный формат. Использование base64 или даже base85 и замена недопустимых символов правильными (повторное экранирование требует места), безусловно, уменьшит вывод. Не так много, как вы утверждаете, ваша математика неверна. Конечно, чем короче URI, тем меньшее сжатие вы можете ожидать, а также имеет значение контекст. 20.10.2010

  • 2

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

    DotNetZip имеет класс DeflateStream, который предоставляет статический (общий в 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 раза больше. Причина в том, что шестнадцатеричный байт на самом деле состоит из двух символов ASCII.

    Вы можете немного компенсировать это, используя base-62 вместо base-16 (шестнадцатеричный) для представления числа. В этом случае 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 по-прежнему не является хорошим подходом. вам действительно нужно хеш-значение.

    29.01.2010
  • Вывод этого ответа (с использованием сжатия .... все еще не является хорошим подходом) больше не действителен - см. Мой ответ - stackoverflow .com / a / 50751602/887092 19.05.2012
  • Думаю, это именно то, что я ищу. У вас есть какой-нибудь пример кода или проект, которым вы могли бы поделиться? Я не смог найти ничего на сайте, на который вы указали. 18.07.2019

  • 3

    Я бы посоветовал поискать в пространстве имен System.IO.Compression < / а>. Есть статья о CodeProject, которая может помочь.

    28.07.2009

    4

    Я только что создал схему сжатия, нацеленную на URL-адреса и обеспечивающую сжатие около 50% (по сравнению с представлением исходного текста URL-адреса в формате base64).

    см. http://blog.alivate.com.au/packed-url/


    Было бы здорово, если бы кто-нибудь из крупной технологической компании построил это должным образом и опубликовал для всех. Google выступает за буферы протокола. Этот инструмент может сэкономить много места на диске для кого-то вроде Google, оставаясь при этом поддающимся сканированию. А может, сам великий капитан? https://twitter.com/capnproto

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

    07.06.2018
  • У меня есть код, который я могу откопать. Пожалуйста, оставьте комментарий в моем блоге, и мы сможем подключиться таким образом. 15.07.2019
  • Меня не волнует сила сжатия - я ищу что-то, что работает очень хорошо и быстро реализуется. Вы можете указать мне на base64? 18.07.2019

  • 5

    Какая у тебя цель?

    • Более короткий URL? Попробуйте сократить URL-адреса, например http://tinyurl.com/ или http://is.gd
    • Пространство для хранения? Проверьте System.IO.Compression. (Или SharpZipLib)
    28.07.2009
  • Base64 ничего сжимать не собирается :) 28.07.2009
  • @Jon Grant: Верно. Base64 был глупым предложением. Будет работать только после фактического сжатия, чтобы получить что-то (возможно) меньше, но все же ascii. Убрали все следы предложения. 28.07.2009
  • А вот пример 4000-символьный URL, который не может быть решен с помощью хэш-таблицы, поскольку апплет может существовать на любом сервере. 28.07.2009

  • 6

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

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

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

    20.10.2010

    7

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

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

    28.07.2009

    8

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

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

    28.07.2009

    9

    Почему? Вероятно, есть лучший способ сделать то, о чем вы просите.

    28.07.2009
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..