压缩一个短但重复的字符串

时间:2012-06-12 09:07:21

标签: c# .net compression

我正在开发一个需要在查询字符串(特别是GET而不是POST)上获取文件列表的Web应用程序,例如:

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

我想缩短那个字符串:

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

字符串不是很长,从20-150个字符不等。短的东西并不适合GZip,但它确实有很多重复,所以压缩应该是可能的。

我不想要数据库或字典字典 - 这个URL将由不同的应用程序构建到消费它的应用程序。我想要一个可逆的压缩缩短这个URL。它不需要是安全的。

有现成的方法吗?我在C#/ .Net工作但很乐意适应其他语言/堆栈的算法。

2 个答案:

答案 0 :(得分:1)

如果您可以在BNF中表达数据,则可以为数据构建解析器。您可以发送数据,而不是发送数据,其中每个节点将被识别为一个字符(如果您有许多不同的节点,则为几个)。在你的例子中

我们可以

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

您可以使用0,1,2表示路径[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/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]

使用如此短的字符串将重复的部分压缩到小于唯一值是可能的,但很可能必须基于约束可能的值或在“压缩”时实际增加大小的风险

答案 1 :(得分:0)

您可以尝试zlib使用原始deflate(没有zlib或gzip标头和预告片)。它通常会在由可打印字符组成的短字符串上提供一些压缩,并且会查找并利用重复的字符串。我还没有尝试过,但也可以查看smaz是否适用于您的数据。

我建议您获取大量真实示例网址,以用于对可能的压缩方法进行基准测试。