題 使用sha256哈希壓縮文本文件似乎效率太高


我有一個ASCII編碼的文本文件,其中每一行具有以下結構:

XYplorer nn.nn.nnnn [yyyy-mm-dd hh.mm.ss] [S256 S256].zip
         ↑↑ ↑↑ ↑↑↑↑  ↑↑↑↑ ↑↑ ↑↑ ↑↑ ↑↑ ↑↑   ↑64× ↑64×

所以一行是177個字符長,27個字符不會改變,另外150個字符改變,兩個哈希值組成128個這樣的字符。我還假設哈希基本上是隨機文本,因此難以壓縮

27/177 = 15.3% 固定文本

22/177 = 12.4% 改變文字

128/177 = 72.3% 隨機文字

然而,在Windows上壓縮這樣的文件(1854行)標準(右鍵)方式我實現了49%的壓縮率,這讓我感到困惑,因為它似乎太高/有效。

你能解釋一下這個隨機部分是如何壓縮的嗎?


3
2017-09-01 16:31


起源


您認為zip壓縮文本。它沒有,它壓縮字節。看到 這個鏈接 用於放氣方法。 - Mixxiphoid
另一個要點是SHA散列的字母表非常有限(只使用了16個不同的字符),因此有助於壓縮。僅僅因為字符是隨機順序並不意味著它們根本不能被壓縮。 - heavyd


答案:


這裡的關鍵元素是這是一個ascii編碼文件。

因此,每個字符使用8位編碼。 177×8 =每行1416位。但是,177個字符不計算行結尾,在窗口中,行結尾編碼為“\ r \ n”(回車,換行),因此每行使用179個字符,每行提供1432位。

您的SHA256每個都是64位十六進制數字。十六位數可以簡單地打包以僅使用4位(2 ^ 4 = 16),這是一半大小。

讓我們分解一下:

  • (27 + 2)/ 179 = 16.2%固定文本(假設無限可壓)
  • 22/179 = 12.3%更改文本
  • 128/179 = 71.5%可以使用%50大小編碼的文本。

單獨使用該映射,我得到128/2 + 22 = 86字節或688位。

  • 688/1432 =原始大小的48%。

這沒有考慮可以對更改文本執行的任何額外壓縮,看起來它們通常是ascii數字,其遭受與ascii十六進制數字相同的打包損失。

為了100%誠實,我很驚訝Windows壓縮不會做得更好。


4
2017-11-10 16:57



為什麼這會被貶低?我認為這是一個很好的答案。 - JakeGould