100日後に完成するゲームシステム 64日目「javascriptでデータ圧縮」

2021年4月17日

テクノロジー 特集

eyecatch 圧縮と復元はアルゴリズムごと大好きな、弓削田です。 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での復元(圧縮も・・・)忘れてた・・・ また今度・・・ということで・・・

人気の投稿

このブログを検索

ごあいさつ

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

ブログ アーカイブ