PHPのgzip圧縮で文字列をコンパクトにする3つの方法を比較

2021/07/09

テクノロジー

t f B! P L
eyecatch データ圧縮と暗号化って、比較的似通ったやり方であることに気がついた、ユゲタです。 暗号化は、データを文字コードの数値に変換して、それらを、可逆にできるように、ランダムな配置にしたり、数値をかけ合わせたりするやり方が一般的で、 暗号化は、文字コード化された数値を、可逆な状態で、キレイに整列し直して、同じ値を重複数に変換することで、サイズをコンパクトにしています。 実際にやってみると分かりますが、結構似たような処理をするんですね。 確かに、それだけが全てというわけでもないので、全く同じと言い切るのも、無理がありますが、 圧縮と暗号のアルゴリズム勉強をすると、コンピュータの仕組みなどもより理解できたという話でした。 そして、そうした技術もより実践的に活用できないと意味が無いので、 今回はPHPで、特定の文字列を圧縮して、より少ないデータ容量にするという事をやろうとした時に、PHPでデフォルトで使える3つの関数を比較テストしてみました。

PHPの文字列圧縮について

まず、基本的に、画像圧縮や何かしらのバイナリデータの圧縮は、ファイル圧縮や、それぞれの圧縮技術にお任せしておくこととして、 今回は文字列というテキストデータを、より容量を小さくするということを目的にしています。 そのPHPで行える文字列圧縮は、gzip方式の圧縮で次の3つが用意されています。
  1. gzdeflate : 文字列を deflate 圧縮する
  2. gzcompress : 文字列を圧縮する
  3. gzencode : 圧縮された文字列を作成する
説明書きを見てもよく分からないと思うので、実際に文字列を圧縮してみて確認してみたいと思います。 次のようなPHPプログラムを用意してみました。 <?php $a0 = "abcdefghij"; // gzdeflate $a1 = urlencode($a0); $a2 = gzdeflate($a1, 9); $a3 = base64_encode($a2); // gzcompress $b2 = gzcompress($a1 , 9); $b3 = base64_encode($b2); // gzencode $c2 = gzencode($a1 , 9); $c3 = base64_encode($c2); echo "<pre>"; echo $a0 ." ( ".strlen($a0)." )".PHP_EOL; echo $a3 ." ( ".strlen($a3)." )".PHP_EOL; echo $b3 ." ( ".strlen($b3)." )".PHP_EOL; echo $c3 ." ( ".strlen($c3)." )".PHP_EOL; echo "</pre>"; これを実行すると、
abcdefghij ( 10 ) S0xKTklNS8/IzAIA ( 16 ) eNpLTEpOSU1Lz8jMAgAVhgP4 ( 24 ) H4sIAAAAAAACE0tMSk5JTUvPyMwCADpwgTkKAAAA ( 40 )
このような結果が表示されます。 これは、元の"abcdefghij"という10文字の文字列を、それぞれの関数で圧縮した時の結果文字列です。 そもそも、圧縮技術は、同じ文字列をまとめることが基本なので、まったくバラバラの文字列だけだと逆に大きくなってしまうんですね。 これを、同じ文字数で"aaaaaaaaaa"という文字列でやってみたらどうなるかと言うと・・・
aaaaaaaaaa ( 10 ) S0yEAQA= ( 8 ) eNpLTIQBABThA8s= ( 16 ) H4sIAAAAAAACE0tMhAEA8M0RTAoAAAA= ( 32 )
defrate圧縮が、少し短くなったのがわかります。 さらに、PHPのリファレンスサイトの、この機能の解説ページの文字列を試してみると、 gzinflate (PHP 4 >= 4.0.4, PHP 5, PHP 7) gzinflate — deflate圧縮された文字列を解凍する 説明 string gzinflate ( string $data [, int $length = 0 ] ) この関数は収縮された文字列を伸長します。 パラメータ data gzdeflate() により圧縮されたデータを指定します length デコードする最大データ長を指定します 返り値 オリジナルの無圧縮なデータ、もしくはエラー時に FALSE この関数は、もし無圧縮なデータが圧縮された入力 data の 32768 倍、もしくはオプションのパラメータ length 以上の場合、エラーを返します。 例 例1 gzinflate() の例 <?php $compressed = gzdeflate('Compress me', 9); $uncompressed = gzinflate($compressed); echo $uncompressed; ?> 引用 : http://phpweb.hostnet.com.br/manual/ja/function.gzinflate.php
元の文字数 : ( 797 ) gzdeflate : ( 736 ) gzcompress : ( 744 ) gzencode : ( 760 )
※文字列が長いので割愛 どうやら、deflateというアッシュっく方式が優秀なようですね。 個人的にこれを採用して、色々と使ってみることにしましょう。

おまけ

おまけのメリットとしては、テキストデータを圧縮化して、 テキストファイルに保存していても、仮にそれを他の人が見た時に、わけのわからない文字列になっていて、ほんの少しぐらいのセキュリティがアップできるという見方もできます。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ