gzip (DEFLATE)
gzip がテキストを小さくする仕組みを見てみましょう。繰り返しは短いコピーになり、ハフマン符号は頻出する記号に少ないビットを割り当てます。
- ウィンドウ: 32 KB
- コピー: 3-258 バイト
- 符号: 最大 15 ビット
- gzip フレーム: 18 バイト
用語の意味
- リテラル: そのまま書き込まれる文字。その位置から始まる3文字以上の繰り返しがないためです。
- コピー: 「この文字数を、これだけ前から取ってくる」という意味の長さと距離の組。自分が生成するテキストと重なってもかまいません。
- ウィンドウ: 圧縮器が繰り返しを探せる範囲(どこまでさかのぼれるか)。gzip では 32 KB、Brotli では最大 16 MB です。
- ハフマン符号: 記号ごとのビット列。頻出する記号ほど短く、最もまれな2つの記号を何度も結合していく木から作られます。
- プレフィックスフリー: どの符号もほかの符号の先頭部分になっていないため、区切りなしで符号の列を読み戻せます。
テキストは 23 文字、圧縮なしで 184 ビットです。圧縮器は左から右へ読み進め、各位置で、この先に続く部分が前にも出てきたかを調べます。
スペースキー: 再生・一時停止。左右の矢印キー: ステップ移動。Home キーと End キー: ジャンプ。
試してみましょう: 同じ文字を何度も入力してみてください。距離 1 のコピー1つですべてをカバーできます。コピーは自分が生成するテキストと重なってもよいからです。
仕組み
gzip は DEFLATE を2段階で実行します。LZ77 はテキストを先頭から順にたどり、各位置で直前の 32 KB にすでに出てきた最長のバイト列を探します。そのバイトを繰り返す代わりに、コピーするバイト数(3-258)とどれだけ前にあるかの組を書き込みます。残ったもの、つまりリテラルとこれらの組は、次にハフマン符号で書き込まれます。頻出する記号には短い符号、まれな記号には長い符号が割り当てられます。gzip はその結果を 10 バイトのヘッダーと、CRC-32 チェックサムを含む 8 バイトのトレーラーで包みます。
向いている場面
gzip は繰り返しの多いテキストを圧縮します。HTML、CSS、JavaScript、JSON、ログ、CSV などです。すべてのブラウザとサーバーが対応し、どのレベルでも速く、レスポンスをその場で圧縮するときの無難な既定の選択です。JPEG、PNG、WOFF2、ZIP のようにすでに圧縮されたデータには繰り返しが残っていないので、gzip は自分のフレームを付け足すだけです。
あなたのテキストで
同じ2段階を、実際の gzip(レベル 6)がもっと長いテキストで行います。自分のテキストを貼り付けるか、Gzip・Brotli 圧縮ツールから持ってきてください。