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 для сжатия тела запросов и ответов, что позволяет значительно уменьшить объём передаваемых данных.
Источники
- RFC 1950 — ZLIB Compressed Data Format Specification version 3.3
- RFC 1951 — DEFLATE Compressed Data Format Specification version 1.3
- RFC 1952 — GZIP file format specification version 4.3
- Официальный сайт проекта zlib: zlib.net
- Исходный код библиотеки zlib
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →