[英]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/item
用2
表示, /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]
用這樣的短字符串將重復部分壓縮到小於唯一值是可能的,但是最有可能必須基於限制可能的值,或者在“壓縮”時冒實際增大大小的風險
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.