【发布时间】:2013-01-11 14:25:15
【问题描述】:
我正在尝试优化一个程序,该程序需要在流的每个位置(字节)处为数据流中的恒定大小窗口计算散列。在比可用 RAM 大得多的磁盘文件中查找重复项是必需的。目前我为每个窗口计算单独的 md5 散列,但它花费大量时间(窗口大小为几千字节,因此每个数据字节被处理几千次)。我想知道是否有一种方法可以在恒定(与窗口大小无关)时间内计算每个后续哈希(例如移动平均线中 1 个元素的加法和减法)?散列函数可以是任何东西,只要它不提供长散列(50-100 位是可以的)并且它的计算速度相当快。它还必须在多达数万亿个不那么随机的窗口(TB 数据)上几乎不产生碰撞——在我的情况下,每次碰撞都意味着磁盘访问(crc32 非常弱,md5 在这方面还可以)。
如果您指出 linux 上可用的现有库函数(如果有的话),我将不胜感激。
这是我在这里的第一个问题,如果我做错了什么,请多多包涵。
问候, 巴托斯
【问题讨论】:
-
良好散列函数的一个属性(导致统计上适当数量的冲突)是它们的最终值取决于混合输入数据的 /all/ 位,即在它们的在下一个数据块的每个处理步骤中进行计算,结果取决于到目前为止已处理的所有位。如果现在您想“仅”省略前 N 位,这意味着所有后续计算步骤所依赖的数据都不同,因此所有步骤都必须重做。所以你至少得放弃今天好的散列函数的这种力量。