web-dev-qa-db-ja.com

本当にシンプルな短い文字列圧縮

長さが約255文字までの文字列に対して本当に簡単な圧縮技術はありますか(はい、私は圧縮しています RL )?

私は圧縮の強さには関心がありません-私は非常にうまく機能し、実装が速いものを探しています。 SharpZipLib :いくつかの短いメソッドで実装できるものよりも単純なものが欲しいです。

22
cbp

ここでの重要な質問は「なぜURLを圧縮したいのですか?」だと思います。

アドレスバーの長いURLを短くしようとしていますか?

非ドメイン部分のハッシュコード(MD5で問題ありません)と一緒に、元のURLをどこかに(データベース、テキストファイルなど)保存することをお勧めします。次に、MD5を読み取って実際のURLを検索するための単純なページ(または派手な感じの場合はHTTPModule)を作成できます。これがTinyURLなどの仕組みです。

例えば:

http://mydomain.com/folder1/folder2/page1.aspx

ショートする可能性があります:

http://mydomain.com/2d4f1c8a

これに圧縮ライブラリを使用しても機能しません。文字列は短いバイナリ表現に圧縮されますが、これをURLの一部として有効である必要がある文字列(Base64など)に変換し直すと、圧縮によって得られるメリットが失われます。

メモリまたはディスクに大量のURLを保存しますか?

System.IO.Compression内の組み込みの圧縮ライブラリまたはZLibライブラリを使用します。これはシンプルで非常に優れています。バイナリデータを保存するので、圧縮された出力はそのままで問題ありません。 URLとして使用するには、解凍する必要があります。

20
badbod99

受け入れられた答え で示唆されているように、データ圧縮を使用しても、すでにかなり短いURLパスを短縮することはできません。

DotNetZip には、静的(VBで共有)を公開するDeflateStreamクラスがあります CompressString メソッド。これは、DEFLATE( RFC 1951 )を使用して文字列を圧縮する1行の方法です。 DEFLATEの実装は System.IO.Compression.DeflateStream と完全に互換性がありますが、DotNetZipの方が圧縮率が高くなります。使用方法は次のとおりです。

string[] orig = {
    "folder1/folder2/page1.aspx",
    "folderBB/folderAA/page2.aspx",
};
public void Run()
{
    foreach (string s in orig)
    {
        System.Console.WriteLine("original    : {0}", s);
        byte[] compressed = DeflateStream.CompressString(s);
        System.Console.WriteLine("compressed  : {0}", ByteArrayToHexString(compressed));
        string uncompressed = DeflateStream.UncompressString(compressed);
        System.Console.WriteLine("uncompressed: {0}\n", uncompressed);
    }
}

そのコードを使用して、これが私のテスト結果です:

original    : folder1/folder2/page1.aspx
compressed  : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx

original    : folderBB/folderAA/page2.aspx
compressed  : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx

したがって、「圧縮された」バイト配列は、16進数で表される場合、元の配列よりも長く、約2倍の長さであることがわかります。その理由は、16進バイトが実際には2 ASCII charsであるためです。

数値を表すために基数16(16進数)の代わりに基数62を使用することで、これをいくらか補うことができます。その場合、a-zとA-Zも数字であり、0-9(10)+ a-z(+26)+ A-Z(+26)=合計62桁になります。これにより、出力が大幅に短縮されます。私はそれを試していません。まだ。


[〜#〜]編集[〜#〜]
わかりました。Base-62エンコーダーをテストしました。六角ストリングを約半分に短縮します。 25%に削減できると思いました(62/16 = 〜4)しかし、離散化によって何かを失っていると思います。私のテストでは、結果のbase-62でエンコードされた文字列は元のURLとほぼ同じ長さです。したがって、いいえ、圧縮を使用してからbase-62エンコーディングを使用することはまだ良いアプローチではありません。本当にハッシュ値が必要です。

12
Cheeso

System.IO.Compression名前空間 を調べることをお勧めします。 CodeProjectに関する記事 が役立つかもしれません。

3
Dan Diplo

あなたの目標は何ですか?

  • 短いURL? http://tinyurl.com/ または http://is.Gd/ のようなURL短縮サービスを試してください
  • 収納スペース? System.IO.Compressionを確認してください。 (または SharpZipLib
1
peSHIr

URLを対象とし、約50%の圧縮を実現する圧縮スキームを作成しました(元のURLテキストのbase64表現と比較して)。

http://blog.alivate.com.au/packed-url/ を参照してください

1
Todd

まず、既存の(無料またはオープンソースの)Zipライブラリの1つを試してみます。 http://www.icsharpcode.net/OpenSource/SharpZipLib/

Zipはテキスト文字列に対して適切に機能するはずですが、圧縮アルゴリズムyourserlfを実装する価値があるかどうかはわかりません。

0
Grzenio

gzip を使用してみましたか?

このような短い文字列で効果的に機能するかどうかはわかりませんが、おそらく最善の策だと思います。

0
Justin

オープンソースライブラリ SharpZipLib は使いやすく、圧縮ツールを提供します

0
Wolfwyrd

この質問で説明されているように、ヘッダーのチェックサムやフッターなしで、deflateアルゴリズムを直接使用できます。 Python:Inflate and Deflateの実装

これにより、私のテストでは4100文字のURLが1270 base64文字に削減され、IEの2000の制限内に収まるようになります。

4000文字のURL の例を次に示します。これは、アプレットがどのサーバーにも存在する可能性があるため、ハッシュテーブルでは解決できません。

0
endolith