# LZ4

LZ4 és un algorisme de compressió de dades sense pèrdua que se centra en la velocitat de compressió i descompressió. Pertany a la família LZ77 d'esquemes de compressió orientats a bytes.

## Característiques

Els algorismes LZ4 pretenen oferir un bon compromís entre velocitat i relació de compressió. Normalment, té una relació de compressió més petita (és a dir, pitjor) que l'algorisme LZO similar, que al seu torn és pitjor que algorismes com DEFLATE. Tanmateix, la velocitat de compressió LZ4 és similar a LZO i diverses vegades més ràpida que DEFLATE, mentre que la velocitat de descompressió és significativament més ràpida que LZO.

## Disseny

LZ4 només utilitza una fase de concordança de diccionari (LZ77) i, a diferència d'altres algorismes de compressió comuns, no la combina amb una fase de codificació d'entropia (per exemple, la codificació de Huffman a DEFLATE).
L'algorisme LZ4 representa les dades com una sèrie de seqüències. Cada seqüència comença amb un testimoni d'un byte que es divideix en dos camps de 4 bits. El primer camp representa el nombre de bytes literals que s'han de copiar a la sortida. El segon camp representa el nombre de bytes a copiar de la memòria intermèdia de sortida ja descodificada (amb 0 representa la longitud mínima de coincidència de 4 bytes). Un valor de 15 en qualsevol dels camps de bits indica que la longitud és més gran i que hi ha un byte addicional de dades que s'ha d'afegir a la longitud. Un valor de 255 en aquests bytes addicionals indica que s'ha d'afegir un altre byte. Per tant, les longituds arbitràries es representen per una sèrie de bytes addicionals que contenen el valor 255. La cadena de literals ve després del testimoni i els bytes addicionals necessaris per indicar la longitud de la cadena. Això va seguit d'un desplaçament que indica fins a quin punt es pot començar a copiar a la memòria intermèdia de sortida. Els bytes addicionals (si n'hi ha) de la longitud de la concordança es troben al final de la seqüència.
La compressió es pot dur a terme en un corrent o en blocs. Es poden aconseguir ràtios de compressió més alts invertint més esforç en trobar les millors coincidències. Això es tradueix en una sortida més petita i una descompressió més ràpida.

## Implementació

La implementació de referència en C per Yann Collet està autoritzada sota una llicència BSD. Hi ha ports i enllaços en diversos idiomes com Java, C#, Rust i Python. El sistema Apache Hadoop utilitza aquest algorisme per a una compressió ràpida. LZ4 també es va implementar de forma nativa al nucli Linux 3.11. Les implementacions de FreeBSD, Illumos, ZFS a Linux i ZFS-OSX del sistema de fitxers ZFS admeten l'algoritme LZ4 per a la compressió sobre la marxa. Linux admet LZ4 per a SquashFS des de 3.19-rc1. LZ4 també és compatible amb la nova utilitat de línia d'ordres zstd de Yann Collet.
LZ4 disponible en versió ampliada 7zip.

## Referències

* ↑ Collet, Yann. «LZ4 Frame Format Description». GitHub. [Consulta: 7 octubre 2020].
* ↑ Michael Larabel. «Support For Compressing The Linux Kernel With LZ4» (en anglès). Phoronix, 28-01-2013. [Consulta: 28 agost 2015].
* ↑ Collet, Yann. «LZ4 Block Format Description» (en anglès). GitHub, 30-03-2019. [Consulta: 9 juliol 2020].
* ↑ Yann Collet. «RealTime Data Compression» (en anglès), 26-05-2011. [Consulta: 28 agost 2015].
* ↑ ticki. «How LZ4 works» (en anglès), 25-10-2016. [Consulta: 29 juny 2017].
* ↑ Jonathan Corbet. «Kernel development» (en anglès). LWN.net, 19-07-2013. [Consulta: 28 agost 2015].
* ↑ «FreeBSD 9.2-RELEASE Release Notes» (en anglès). FreeBSD, 13-11-2013. [Consulta: 28 agost 2015].
* ↑ «LZ4 Compression» (en anglès). illumos. Arxivat de l'original el 9 October 2018. [Consulta: 28 agost 2015].
* ↑ «Features: lz4 compression» (en anglès). OpenZFS. [Consulta: 28 agost 2015].
* ↑ Phillip Lougher. «Squashfs: Add LZ4 compression configuration option», 27-11-2014. [Consulta: 28 agost 2015].