LZ4

LZ4は、圧縮と展開の速さに焦点を当てた可逆圧縮アルゴリズムである。バイト指向の圧縮方法であるLZ77ファミリーに属する。Yann Collet が2011年より開発している。
Yann Collet は LZ4 の開発を始めた4年後の2015年より Zstandard も開発している。
機能.
gzipのようなアルゴリズムより低い圧縮率であるLZOよりわずかに圧縮率が低い。しかし、圧縮速度はLZOと同等であり、gzipより数倍速い。展開速度はLZOより著しく速くなりうる。
Zstandard の開発者によると LZ4 と Zstandard の --fast=4 が同程度の圧縮率だが、解凍速度は LZ4 の方が速い。
設計.
LZ4はデータをシーケンスの連続として表現する。それぞれのシーケンスは、2つの4ビットフィールドに分けられた1バイトのトークンで始まる。最初のフィールドは、出力にコピーされるリテラルバイトの数字で表現される。2つ目のフィールドはすでにデコードした出力バッファからコピーするバイト数を表す（0は最小の一致長である4バイトを表わす）。ビットフィールドのどちらかの値が15なら、長さがそれ以上で追加のデータがあることを示す。値が255のときは、さらにもう1バイト追加されることを示す。そのように、255の値を含む追加のバイトの並びによって任意の長さが表現される。リテラルの文字列が、追加のバイトとトークンのあとにあるなら文字列の長さを示す必要がある。この後にはオフセットが続き、出力バッファでコピーを始めるときにどれだけ戻るかを示す。（もしあればであるが、）シーケンスの終わりには一致長の追加バイトがある
圧縮はストリームまたはブロックで実行できる。より高い圧縮率は、最良一致を探し出すことに、より注力することで達成される。その結果より小さな出力とより速い展開速度が得られる。
実装.
Yann Collet による C のリファレンス実装があり、BSDライセンスである。 Java、C#、Python などの多様な言語へのポートやバインディングがある。
利用例.
Hadoop のようなデータベースも、速い圧縮のためにこのアルゴリズムを利用している。
Linuxカーネル 3.11にもネイティブに実装されている。Linux は SquashFS のために LZ4 を 3.19-rc1 からサポートしている。
FreeBSD、Illumos、Linux ZFS、ZFS-OSX におけるZFSファイルシステムの実装はオンザフライ圧縮のために LZ4 アルゴリズムをサポートしている。
PlayStation 4やNintendo Switch に利用されている。その他の採用例については公式サイトを参照のこと。
bsdtar では採用されているが、GNU tar では採用されていない。同じ Yann Collet が開発した Zstandard は GNU tar でも bsdtar でも採用されている。