簡體   English   中英

壓縮短而重復的字符串

[英]Compress a short but repeating string

我正在使用一個Web應用程序,該應用程序需要在查詢字符串(特別是GET而不是POST)上獲取文件列表,例如:

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中工作,但很樂意從其他語言/堆棧改編算法。

如果可以用BNF表示數據,則可以為該數據構造一個解析器。 代替發送數據,您可以發送AST,在該AST中,每個節點將被標識為一個字符(如果您有很多不同的節點,則可以標識為幾個字符)。 在你的例子中

我們可以有

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

您可以將文件列表表示為path [id1,id2,...,idn],使用0,1,2作為路徑,輸入為:

/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/item2表示, /files/item/1表示。 [...]中的每個數字都是一個id。 所以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]

用這樣的短字符串將重復部分壓縮到小於唯一值是可能的,但是最有可能必須基於限制可能的值,或者在“壓縮”時冒實際增大大小的風險

您可以使用原始deflate嘗試zlib (沒有zlib或gzip標頭和尾標)。 即使在由可打印字符組成的短字符串上,它也會提供某種壓縮效果,並且確實會尋找並利用重復的字符串。 我沒有嘗試過,但是還可以查看smaz是否對您的數據有效。

我建議您獲取大量真實的示例URL,以用於可能的壓縮方法的基准測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM