繁体   English   中英

使用python,如何压缩长查询字符串值?

[英]Using python, how can I compress a long query string value?

因此,我正在python中为GET请求生成一个URL(必须是GET请求),而我的查询字符串参数之一是EXTREMELY long(〜900个字符),有什么办法可以压缩此字符串并将其放在网址? 我尝试过zlib但是它使用字节,并且url需要为字符串。 基本上有什么方法可以做到这一点?

# On server
x = '900_char_string'
compressed_string = compress(x)
return 'http://whatever?querystring_var=' + compressed_string
# ^ return value is what client requests by clicking link with that url or whatever
# On client
# GET http://whatever?querystring_var=randomcompressedchars<900
# Server receiving request
value = request['querystring_var']
y = decompress(value)
print(y)
>>> 900_char_string  # at this point server can work with the uncompressed string


现在,这个问题已经很清楚了。 我认为我们需要从信息论的角度对此进行研究。

  • 输入是一串可见字符,当前每个字符以8位表示。
  • 该字符串的“字母”是字母数字(26 + 26 + 10个符号),加上大约20个特殊和保留字符,总共80+个字符。
  • 生成的字符串中没有明显的冗余。

利用以下三个主要途径可以缩短代表人数:

  • 字符频率(汉明):用少于8位代替常用字符; 对于稀有字符,则需要更长的位字符串。
  • 子字符串的频率(压缩):用单个字符替换频繁出现的子字符串。
  • 转换为其他基数:理想的是len(alphabet)。

前两种方法可以加长结果字符串,因为它们需要从转换表开始。 另外,由于您的字符串似乎取自统一的随机分布,因此不会产生冗余或通用性。 当香农熵等于或接近输入令牌的最大值时,这些方法将无济于事。

这使我们有了基础转换。 我们使用8位(256个组合)表示仅82个字符的字母。 一个简单的基本转换将节省大约20%; 比率是log(82)/ log(256)。 如果您想要便宜的转换,只需将其映射到7位表示中,可节省12.5%

很简单,在字符集上定义符号序号,例如

0123456789ABCDEFGH...YZabcd...yz:/?#[]()@!$%&'*+,;=%   (81 chars)

现在,计算给定字符串的等效数值,就好像您是手工编码从十进制或十六进制字符串的转换一样。 所得的大整数是压缩值。 以字节为单位写出,或将其切成32位整数,或适合您的中间存储介质的任何形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM