圧縮と復元はアルゴリズムごと大好きな、弓削田です。
webサービスを構築する時に、データベースって、SQLに頼りがちだけど、
実際にwebネットワークをデータが通信していくのは、プログラミングした人の腕の見せどころです。
何が見せ所なのかというと、データがハッキングされないように、
暗号化する事と、出来る限りデータを小規模化して、必要最低限で、
多くの情報のやり取りができるという工夫も、
サービス構築設計に含まれているという事です。
以前にもブログで、データ暗号化について書いたんですが、
100日後に完成するゲームシステム 30日目「セーブデータの暗号化処理」
そのデータが肥大化する恐れがあるので、出来る限りデータ圧縮をしたいと考えたところから、
今回は、圧縮を取り込みたいと思います。
そんなに難しくないデータ圧縮
アルゴリズムで考えると、圧縮も非常に重要なプログラミングが必要なのですが、
今回は、javascriptで圧縮して、サーバーにデータ送信をするという仕様で、
できれば、サーバー側のCGI(今回はPHP)で、圧縮を解凍できるように対応もしたいと考えています。
ただ、とりあえず、javascriptのみで行うことを考えて、検索してみたら、
ドンピシャのライブラリがGithubに転がっていました。
https://github.com/johan/js-deflate
こいつです。
READMEも何も用意されていないツールなのですが、
どうやら、テキストデータの容量が33%ぐらいに圧縮されるようです。
正直、zip圧縮であれば、10%ぐらいの精度はでるとは思うんだけど、バイナリデータを扱うのも、
少しめんどくさいし、javascriptでの実装は、それはそれで、大変になりそうなので、
今回はこいつで手を打つとする。
ライブラリを実装する
githubからDLしたライブラリをhtmlのheadで読みこんで、以下のコードで圧縮、復元ができます。
// RawDeflate : 文字列の短縮圧縮
function compress(val){
val = encodeURIComponent(val); // UTF16 → UTF8
val = RawDeflate.deflate(val); // 圧縮
val = btoa(val); // base64エンコード
return val;
};
// RawDeflate : 短縮圧縮した文字列の復元
function restore(val){
val = atob(val); // base64デコード
val = RawDeflate.inflate(val); // 復号
val = decodeURIComponent(val); // UTF8 → UTF16
return val;
};
比較的簡単にできますが、ポイントは、UTF16をUTF8にすることで、3biteコードを4biteコードに変換されることで、単純計算で25%減ぐらいの効果があります。
暗号化処理をいれると、逆に膨らみがちなんですが、とりあえず、これらを併用することで対応したいと思います。
ちなみに、システムでは、こうした暗号化や圧縮を複数のバージョン持てるようにしてあるので、
今後新たな方式を追加しても、対応可能な状態になってます。
この辺は抜かり無くしないとね!
あ!!!、PHPでの復元(圧縮も・・・)忘れてた・・・
また今度・・・ということで・・・
0 件のコメント:
コメントを投稿