データ圧縮と暗号化って、比較的似通ったやり方であることに気がついた、ユゲタです。
暗号化は、データを文字コードの数値に変換して、それらを、可逆にできるように、ランダムな配置にしたり、数値をかけ合わせたりするやり方が一般的で、
暗号化は、文字コード化された数値を、可逆な状態で、キレイに整列し直して、同じ値を重複数に変換することで、サイズをコンパクトにしています。
実際にやってみると分かりますが、結構似たような処理をするんですね。
確かに、それだけが全てというわけでもないので、全く同じと言い切るのも、無理がありますが、
圧縮と暗号のアルゴリズム勉強をすると、コンピュータの仕組みなどもより理解できたという話でした。
そして、そうした技術もより実践的に活用できないと意味が無いので、
今回はPHPで、特定の文字列を圧縮して、より少ないデータ容量にするという事をやろうとした時に、PHPでデフォルトで使える3つの関数を比較テストしてみました。
PHPの文字列圧縮について
まず、基本的に、画像圧縮や何かしらのバイナリデータの圧縮は、ファイル圧縮や、それぞれの圧縮技術にお任せしておくこととして、
今回は文字列というテキストデータを、より容量を小さくするということを目的にしています。
そのPHPで行える文字列圧縮は、gzip方式の圧縮で次の3つが用意されています。
- gzdeflate : 文字列を deflate 圧縮する
- gzcompress : 文字列を圧縮する
- 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というアッシュっく方式が優秀なようですね。
個人的にこれを採用して、色々と使ってみることにしましょう。
おまけ
おまけのメリットとしては、テキストデータを圧縮化して、
テキストファイルに保存していても、仮にそれを他の人が見た時に、わけのわからない文字列になっていて、ほんの少しぐらいのセキュリティがアップできるという見方もできます。
0 件のコメント:
コメントを投稿