2

私は、クエリ文字列(具体的には、POSTではなくGET)でファイルのリストを取得する必要があるWebアプリに取り組んでいます。

http://site.com/app?things=/stuff/things/item123,/stuff/things/item456,/stuff/things/item789

その文字列を短くしたい:

http://site.com/app?things=somekindofencoding

文字列はそれほど長くはなく、20〜150文字です。短いものはGZipにはあまり適していませんが、繰り返しが非常に多いため、圧縮が可能であるはずです。

文字列のDBまたは辞書は必要ありません。URLは、それを使用するアプリケーションとは異なるアプリケーションによって作成されます。このURLを短縮する可逆圧縮が必要です。安全である必要はありません。

これを行うための既存の方法はありますか?私はC#/。Netで作業していますが、他の言語/スタックのアルゴリズムを採用できれば幸いです。

4

2 に答える 2

1

データをBNFで表現できる場合は、データのパーサーを作成できます。データを送信する代わりに、各ノードが1つの文字(または、多数の異なるノードがある場合は複数)として識別されるASTを送信できます。あなたの例では

私たちは持つことができます

files : file files
      | 
file : path id
path : itemsthing
     | filesitem
     | stuffthingsitem

パスに0,1,2を使用し、入力を次のように使用して、ファイルのリストをpath [id1、id2、...、idn]として表すことができます。

/stuff/things/item123,/stuff/things/item456,/stuff/things/item789
/files/item1,/files/item46,/files/item7

その後、あなたは?things=2[123,456,789]1[1,46,7]

ここで、は/stuff/things/itemで表され、内の各番号で表されるのはidです。に拡大します2/files/item/1[...]2[123]/stuff/things/item123

編集アプローチは静的である必要はありません。繰り返されるアイテムを動的に検出する必要がある場合は、同じアプローチを使用して、識別子とトークンの間でマップを渡すことができます。その場合、上記の例は次のようになります。

?things=2[123,456,789]1[1,46,7]&tokens=2=/stuff/things/,1=/files/item

文法がこの単純な場合はもちろん、

?things=/stuff/things/[123,456,789]/files/item[1,46,7]

このような短い文字列を使用して、繰り返される部分を一意の値未満に圧縮することは可能ですが、可能な値を制限することに基づいている必要があります。そうしないと、「圧縮」時に実際にサイズが大きくなるリスクがあります。

于 2012-06-12T09:33:42.120 に答える
0

raw deflateを使用してzlibを試すことができます(zlibまたはgzipのヘッダーとトレーラーは使用できません)。一般に、印刷可能な文字で構成され、繰り返される文字列を探して利用する短い文字列でも、ある程度の圧縮を提供します。私はそれを試していませんが、smazがあなたのデータに対して機能するかどうかも確認できました。

可能な圧縮アプローチのベンチマークテストに使用する実際のサンプルURLの大規模なセットを取得することをお勧めします。

于 2012-06-12T15:56:06.863 に答える