我想优化一个程序,需要计算一个数据流中的每个位置(字节)的恒定大小的窗口散列。需要在磁盘文件中查找比可用RAM大得多的重复数据。目前,我为每个窗口计算单独的md5散列,但花费很多时间(窗口大小为几千字节,因此每个数据字节处理几千次)。我想知道是否存在一种方法来计算常量(窗口大小无关)时间内的每个后续散列(例如移动平均中1个元素的加减)?散列函数可以是任何东西,只要它不会产生很长的哈希(50-100位是确定的)并且其计算速度相当快。它也必须在多达数以万亿计的非随机窗口(数据TB)上进行实验 - 每次碰撞都意味着我的磁盘访问(crc32非常弱,md5在这方面没问题)。高效的'滚动/移动散列'计算(如移动平均)
如果您指出我现有的Linux上可用的库函数(如果有的话),我将非常感激。
这是我的第一个问题,所以如果我做错了,请耐心等待。
问候, 的Bartosz
良好散列函数的特性之一(导致统计适量的冲突)是它们的最终值取决于混合/输入数据的所有位,即在每个处理步骤的计算中下一块数据的结果取决于迄今为止已处理的所有位。如果现在你想“只”省略前N位,这意味着所有后续计算步骤所依赖的数据是不同的,所以所有的步骤都必须重做。所以你必须至少放弃今天好的散列函数的这种强度。 – PlasmaHH