簡體   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