我想優化一個程序,需要計算一個數據流中的每個位置(字節)的恆定大小的窗口散列。需要在磁盤文件中查找比可用RAM大得多的重複數據。目前,我爲每個窗口計算單獨的md5散列,但花費很多時間(窗口大小爲幾千字節,因此每個數據字節處理幾千次)。我想知道是否存在一種方法來計算常量(窗口大小無關)時間內的每個後續散列(例如移動平均中1個元素的加減)?散列函數可以是任何東西,只要它不會產生很長的哈希(50-100位是確定的)並且其計算速度相當快。它也必須在多達數以萬億計的非隨機窗口(數據TB)上進行實驗 - 每次碰撞都意味着我的磁盤訪問(crc32非常弱,md5在這方面沒問題)。高效的'滾動/移動散列'計算(如移動平均)
如果您指出我現有的Linux上可用的庫函數(如果有的話),我將非常感激。
這是我的第一個問題,所以如果我做錯了,請耐心等待。
問候, 的Bartosz
良好散列函數的特性之一(導致統計適量的衝突)是它們的最終值取決於混合/輸入數據的所有位,即在每個處理步驟的計算中下一塊數據的結果取決於迄今爲止已處理的所有位。如果現在你想「只」省略前N位,這意味着所有後續計算步驟所依賴的數據是不同的,所以所有的步驟都必須重做。所以你必須至少放棄今天好的散列函數的這種強度。 – PlasmaHH