# Zstandard

Zstandard (ou zstd) é um algoritmo de compressão de dados sem perdas desenvolvido por Yann Collet no Facebook. Zstd é a implementação de referência em C. A versão 1 desta implementação foi lançada como software livre em 31 de agosto de 2016.

## Recursos

O Zstandard foi projetado para oferecer uma taxa de compressão comparável à do algoritmo DEFLATE (desenvolvido em 1991 e usado nos programas ZIP e gzip originais), porém mais rápido, especialmente para descompressão. É configurável com níveis de compressão que variam de 5 negativos (mais rápido) a 22 (mais lento na velocidade de compressão, mas com a melhor taxa de compressão).
O pacote zstd inclui implementações paralelas (multi-threaded) tanto de compressão como de descompressão. A partir da versão 1.3.2 (outubro de 2017), o zstd opcionalmente implementa busca e deduplicação de longo alcance similar ao rzip ou lrzip.
A velocidade de compressão pode variar por um fator de 20 ou mais entre os níveis mais rápidos e lentos, enquanto a descompressão é uniformemente rápida, variando menos de 20% entre os níveis mais rápidos e mais lentos.
O Zstd em seu nível máximo de compressão dá uma taxa de compressão próxima a lzma, lzham e ppmx, e tem um desempenho melhor que lza, ou bzip2. O Zstandard atinge a fronteira de Pareto atual, pois se descomprime mais rapidamente do que qualquer outro algoritmo atualmente disponível com taxa de compressão similar ou melhor.
Os dicionários podem ter um grande impacto na taxa de compressão de arquivos pequenos, por isso o Zstandard pode usar um dicionário de compressão fornecido pelo usuário. Ele também oferece um modo de treinamento, capaz de gerar um dicionário a partir de um conjunto de amostras. Em particular, um dicionário pode ser carregado para processar grandes conjuntos de arquivos com redundância entre arquivos, mas não necessariamente dentro de cada arquivo, por exemplo, arquivos de log.

## Design

O Zstandard combina um estágio de correspondência de dicionário (LZ77) com uma grande janela de busca e um estágio de codificação entrópica rápida, usando tanto a Entropia de Estado Finito (uma versão rápida de ANS, tANS, usada para entradas na seção sequências), quanto a codificação de Huffman (usada para entradas na seção de Literais).
Devido à forma como o FSE transpõe o estado entre símbolos, a descompressão envolve o processamento de símbolos dentro da seção de Sequências de cada bloco em ordem inversa (do último para o primeiro).

## Uso

O núcleo Linux tem incluído o Zstandard desde novembro de 2017 (versão 4.14) como um método de compressão para os sistemas de arquivos btrfs e squashfs.
Em 2017, Allan Jude integrou o Zstandard ao núcleo FreeBSD e o usou para criar um método de compressão do OpenZFS como prova de conceito. Ele foi posteriormente integrado como uma opção de compressão para os dumps do núcleo (tanto de programas de usuário quanto de pânicos do kernel).
Os bancos de dados AWS Redshift e RocksDB incluem suporte para compressão de campo usando o Zstandard.
Em março de 2018, a Canonical testou a habilitação do zstd como um método de compressão de pacotes deb por padrão para a distribuição Linux Ubuntu. Comparado com a compressão xz de pacotes deb, o zstd no nível 19 descomprime significativamente mais rápido, mas com o custo de arquivos de pacotes 6% maiores. As pessoas do Debian, como Ian Jackson, preferem esperar cinco anos.
Em 2018 o algoritmo foi publicado como RFC 8478, que também define um tipo de mídia associada "application/zstd", extensão de nome de arquivo "zst", e codificação de conteúdo HTTP "zstd".
O Arch Linux adicionou suporte ao zstd como um método de compressão de pacotes em outubro de 2019 com o lançamento do gerenciador de pacotes pacman 5.2, e em janeiro de 2020 mudou a compressão dos pacotes no repositório oficial de xz para o zstd. O Arch usa zstd -c -T0 --ultra -20 -, o tamanho de todos os pacotes comprimidos combinados aumentou em 0,8% (comparado ao xz), a velocidade de descompressão é 1300% mais rápida, a memória de descompressão aumentou em 50 MiB ao usar múltiplos threads, a memória de compressão aumenta, mas escala com o número de threads usados.
Implementação completa do algoritmo com opção para escolher o nível de compressão utilizado nos formatos de arquivo .NSZ / .XCZ, desenvolvido pela comunidade homebrew para o Nintendo Switch, um console de jogos híbrido.

## Licença

A implementação de referência é licenciada sob a licença BSD, publicada no GitHub. Desde a versão 1.0, ela teve uma concessão adicional de direitos de patente.
A partir da versão 1.3.1, essa concessão de patente foi removida e a licença foi alterada para uma licença dupla BSD + GPLv2.