LZ4 (algoritmo de compresión)
# LZ4 (algoritmo de compresión)

LZ4 es un algoritmo de compresión sin pérdida que se centra en la velocidad de compresión y descompresión. Pertenece a la familia LZ77 de esquemas de compresión orientados a bytes.

## Características

El algoritmo proporciona un ratio de compresión ligeramente peor que el algoritmo LZO, que a su vez es peor que algoritmos como DEFLATE. Sin embargo, las velocidades de compresión son similares a LZO y varias veces más rápidas que DEFLATE, mientras que las velocidades de descompresión pueden ser significativamente más altas que LZO.

## Diseño

El algoritmo LZ4 representa los datos como una serie de secuencias. Cada secuencia comienza con un token de un byte que se divide en dos campos de 4 bits. El primer campo representa el número de bytes literales que se copiarán a la salida. El segundo campo representa el número de bytes para copiar desde el búfer de salida ya decodificado (donde 0 representa la longitud mínima de coincidencia de 4 bytes). Un valor de 15 en cualquiera de los campos de bits indica que la longitud es mayor y que hay un byte adicional de datos que se agregará a la longitud. Un valor de 255 en estos bytes adicionales indica que se agregará otro byte. Por lo tanto, las longitudes arbitrarias están representadas por una serie de bytes adicionales que contienen el valor 255. La cadena de literales viene después del token y los bytes adicionales necesarios para indicar la longitud de la cadena. Esto es seguido por un desplazamiento que indica qué tan atrás en el búfer de salida comenzar a copiar. Los bytes adicionales (si los hay) de la longitud de la coincidencia aparecen al final de la secuencia.

La compresión puede llevarse a cabo en un stream o en bloques. Se pueden lograr ratios de compresión más altos invirtiendo más esfuerzo en encontrar las mejores coincidencias. Esto da como resultado una salida más pequeña y una descompresión más rápida.

## Implementación

La implementación de referencia en C de Yann Collet está licenciada bajo una licencia BSD. Hay ports y bindings en varios lenguajes como Java, C#, Python, etc. Bases de datos como Hadoop usan este algoritmo para una compresión rápida. LZ4 también se implementó de forma nativa en el núcleo Linux 3.11. Las implementaciones de FreeBSD, Illumos, ZFS en Linux y ZFS-OSX del sistema de archivos ZFS soportan el algoritmo LZ4 para compresión sobre la marcha. Linux soporta LZ4 para SquashFS desde 3.19-rc1. LZ4 está también implementado en el nuevo archivador Zstd de Yann Collet.

