c# - 压缩一个简短但重复的字符串

标签 c# .net compression

我正在开发一个网络应用程序,它需要在查询字符串(特别是 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,但它确实有很多重复,所以压缩应该是可能的。

我不想要数据库或字符串字典 - URL 将由与使用它的应用程序不同的应用程序构建。我想要缩短此 URL 的可逆压缩。它不需要是安全的。

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

最佳答案

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

我们可以

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

您可以将文件列表表示为路径 [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]

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

关于c# - 压缩一个简短但重复的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10993524/

相关文章:

c# - 如何使 ILspy C# 反编译结果具有更好的格式?

c# - 使用存储过程从复选框切换 bool 值是否有任何安全优势

c# - 如果枚举值相同,我将获得哪个枚举常量

c# - .NET:HttpClient 使用我的接口(interface) IHttpClient 模拟它,但有一个内部对象为 NULL,它是密封的

python - 将两个字符变成一个符号(Python)

java - 将字节数组写入文件(大文件大小)

c# - 将查询结果放入变量中,然后将其传递给命令

c# - 将数字存储在 sql 数据库中的整数中

c++ - 有没有办法知道放气(或你的 Z_STREAM)是否有数据被缓冲? zlib C++

c# - 解析值后遇到意外字符 : 6. Path '[0]