String 的簡易壓縮


#1

單純工作上有時有用到,一直沒 po 文,剛想到丟出來,單純 code

require 'zlib'
require 'base64'

source = 'x' * 256
  #=> too long ... skip

#encode
zlib_en = Zlib::Deflate.deflate(source)
  #=> "x\x9C\xAB\xA8\x18\xD9\x00\x00@\x84x\x01"
zlib_b64_en = Base64.urlsafe_encode64(zlib_en)
  #=> "eJyrqBjZAABAhHgB"

#length
puts "source (#{source.bytesize})"
  #=> source (256)
puts "zlib_en (#{zlib_en.bytesize})"
  #=> zlib_en (12)
puts "zlib_b64_en (#{zlib_b64_en.bytesize})"
  #=> zlib_b64_en (16)

#decode
temp = Zlib::Inflate.inflate(Base64.urlsafe_decode64(zlib_b64_en))

#verify
puts "verify : #{temp == 'x' * 256}"
  #=> verify : true

話說,要學壓縮的基礎應該是從這邊開始(雖然 Zlib 不一定用 Huffman,單純舉例,真正壓縮都是 binary 而非單純的 char 就是)

其實不用太燒腦去搞懂它( … 現在很多方便好用的都寫成 lib 了||| ),機制大概就是建立字典索引檔,然後之後就是把索引填入,所以原文的 'x' * 256 只需要一個字典檔 “x” 和宣告此索引連續使用 256 次即可

文字類(類似 log / json …)都能有非常高的壓縮比,而要能"存入"應該就是選 Base64,但 binary 轉 Base64 大約會增加 1/3(也就是 4/3 倍)的長度就是,urlsafe 會再少些,因為會移除對齊用的 \n 和轉換一些 char 來符合網址格式之類的

大概就這樣唄,以上