Открыть сервис

zlib

zlib — это свободная библиотека сжатия данных общего назначения, реализующая алгоритм DEFLATE. Она предоставляет программный интерфейс (API) для сжатия и распаковки данных в форматах, совместимых с gzip и PKZIP. zlib является одной из наиболее широко используемых библиотек сжатия в мире и входит в состав множества операционных систем, включая Linux, macOS и Windows.

История

Библиотека zlib была создана Жаном-Лу Гайи (Jean-loup Gailly) и Марком Адлером (Mark Adler) как свободная замена утилиты compress, которая была основана на алгоритме LZW и имела ограничения, связанные с патентами. Первая версия zlib 0.5 была выпущена 1 мая 1995 года. Версия 1.0 вышла 31 марта 1995 года. Разработка велась при поддержке компании Info-ZIP.

Основной целью создания zlib было предоставление компактной, эффективной и переносимой библиотеки сжатия, свободной от патентных ограничений, которые затрагивали алгоритмы LZW. Библиотека быстро завоевала популярность благодаря своей простоте, надёжности и высокой производительности.

Алгоритм

zlib реализует алгоритм сжатия DEFLATE, который представляет собой комбинацию двух методов:

  • Кодирование LZ77 (Lempel-Ziv 1977): поиск и замена повторяющихся последовательностей байтов ссылками на предыдущие вхождения.
  • Кодирование Хаффмана: статистическое кодирование, присваивающее более короткие коды более часто встречающимся символам.

Алгоритм DEFLATE позволяет достигать коэффициента сжатия, сопоставимого с другими популярными алгоритмами (например, LZW, LZMA), при относительно высокой скорости работы.

Форматы данных

zlib сама по себе не является форматом файла, а предоставляет механизм сжатия. Однако она определяет три основных формата потока данных:

  • zlib-формат: собственный формат библиотеки, включающий 2-байтовый заголовок (с полями для метода сжатия, уровня сжатия и контрольной суммы), сжатые данные и 4-байтовую контрольную сумму Adler-32. Этот формат используется, например, в протоколах HTTP и SSH.
  • gzip-формат: формат, определённый в RFC 1952. Он включает 10-байтовый заголовок (с метками времени, имени файла, комментариями и т.д.), сжатые данные и 8-байтовый трейлер (CRC-32 и размер исходных данных). gzip является стандартным форматом сжатия в Unix-подобных системах.
  • сырой DEFLATE: просто поток сжатых данных без заголовка и контрольной суммы. Этот формат используется, например, в архиваторах PKZIP и PNG-изображениях.

API и использование

Библиотека zlib предоставляет простой, но мощный C-интерфейс. Основные функции:

  • deflateInit(), deflate(), deflateEnd() — для сжатия данных.
  • inflateInit(), inflate(), inflateEnd() — для распаковки данных.

Пользователь может задать уровень сжатия (от 0 — без сжатия, до 9 — максимальное сжатие) и стратегию сжатия (например, Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE). Библиотека также поддерживает потоковую обработку данных, что позволяет сжимать или распаковывать данные по мере их поступления.

Пример использования на C (сжатие буфера данных): ```c

include <zlib.h>

include <stdio.h>

include <string.h>

int main() { const char source = "Hello, world! Hello, world! Hello, world!"; uLong sourceLen = strlen(source) + 1; uLong destLen = compressBound(sourceLen); Bytef dest = (Bytef*)malloc(destLen);

if (compress(dest, &destLen, (const Bytef*)source, sourceLen) != Z_OK) { fprintf(stderr, "Compression failed\n"); return 1; }

printf("Original size: %lu\n", sourceLen); printf("Compressed size: %lu\n", destLen);

free(dest); return 0; } ```

Применение

zlib является одной из самых распространённых библиотек сжатия в мире. Она используется в огромном количестве программ и систем:

  • Операционные системы: Linux, macOS, Windows, FreeBSD, Android — все они включают zlib в свой состав для сжатия пакетов, файловых систем и других данных.
  • Форматы файлов: PNG (Portable Network Graphics) использует сырой DEFLATE для сжатия изображений. Gzip — стандартный формат сжатия в Unix. ZIP-архивы также могут использовать DEFLATE.
  • Сетевые протоколы: HTTP (сжатие контента с помощью gzip или deflate), SSH (сжатие данных), TLS/SSL (сжатие записей).
  • Базы данных: SQLite, PostgreSQL, MySQL — используют zlib для сжатия страниц данных или резервных копий.
  • Программное обеспечение: Git (сжатие объектов), Docker (сжатие образов), многие другие утилиты и библиотеки.

Производительность

Производительность zlib зависит от уровня сжатия и размера данных. На низких уровнях (1-3) сжатие происходит очень быстро, но коэффициент сжатия невысок. На высоких уровнях (7-9) сжатие занимает больше времени, но достигается лучший коэффициент. Для большинства практических задач используется уровень 6, который обеспечивает хороший баланс между скоростью и степенью сжатия.

Современные реализации zlib (например, zlib-ng) могут использовать аппаратное ускорение (например, инструкции Intel SSE4.2) для значительного повышения производительности.

Критика и альтернативы

Несмотря на широкое распространение, zlib имеет некоторые недостатки:

  • Степень сжатия: Алгоритм DEFLATE уступает по степени сжатия более современным алгоритмам, таким как LZMA (используется в 7z) или Zstandard.
  • Скорость: На высоких уровнях сжатия zlib может быть медленнее, чем некоторые альтернативы.
  • Отсутствие поддержки многопоточности: Базовая реализация zlib не поддерживает многопоточное сжатие.

Основные альтернативы zlib:

  • zlib-ng: Форк zlib, оптимизированный для современных процессоров. Обеспечивает более высокую производительность.
  • Zstandard (zstd): Современный алгоритм сжатия от Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ), обеспечивающий более высокую степень сжатия и скорость, чем zlib.
  • LZ4: Алгоритм, ориентированный на максимальную скорость сжатия и распаковки, часто используется для сжатия в реальном времени.
  • Brotli: Алгоритм сжатия от Google, используемый в основном для сжатия веб-контента.

Интересные факты

  • Название «zlib» происходит от «Ziv-Lempel» (по именам создателей алгоритма LZ77) и «library» (библиотека).
  • Библиотека zlib является одной из самых портируемых — она работает практически на всех платформах, от микроконтроллеров до суперкомпьютеров.
  • Исходный код zlib занимает всего около 10 000 строк на C, что делает её очень компактной.
  • Библиотека zlib используется в протоколе HTTP для сжатия тела запросов и ответов, что позволяет значительно уменьшить объём передаваемых данных.

Источники

  1. RFC 1950 — ZLIB Compressed Data Format Specification version 3.3
  2. RFC 1951 — DEFLATE Compressed Data Format Specification version 1.3
  3. RFC 1952 — GZIP file format specification version 4.3
  4. Официальный сайт проекта zlib: zlib.net
  5. Исходный код библиотеки zlib

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →