C++ 高效';滚动/移动散列';计算(如移动平均)

C++ 高效';滚动/移动散列';计算(如移动平均),c++,hash,C++,Hash,我试图优化一个程序,该程序需要在数据流的每个位置(字节)计算一个恒定大小窗口的哈希值。它用于查找比可用RAM大得多的磁盘文件中的重复。目前,我为每个窗口计算单独的md5哈希,但这需要花费大量时间(窗口大小为几千字节,因此每个字节的数据都要处理几千次)。我想知道是否有一种方法可以在恒定(与窗口大小无关)时间内计算每个后续散列(如移动平均中1个元素的加减)?散列函数可以是任何函数,只要它不提供长散列(50-100位是可以的),并且它的计算速度相当快。它还必须在多达万亿个不太随机的窗口(TB的数据)上

我试图优化一个程序,该程序需要在数据流的每个位置(字节)计算一个恒定大小窗口的哈希值。它用于查找比可用RAM大得多的磁盘文件中的重复。目前,我为每个窗口计算单独的md5哈希,但这需要花费大量时间(窗口大小为几千字节,因此每个字节的数据都要处理几千次)。我想知道是否有一种方法可以在恒定(与窗口大小无关)时间内计算每个后续散列(如移动平均中1个元素的加减)?散列函数可以是任何函数,只要它不提供长散列(50-100位是可以的),并且它的计算速度相当快。它还必须在多达万亿个不太随机的窗口(TB的数据)上几乎不出现冲突——在我的情况下,每次冲突都意味着一次磁盘访问(crc32非常弱,md5在这方面还可以)

如果您能给我指出linux上现有的库函数(如果有的话),我将不胜感激

这是我在这里的第一个问题,所以如果我做错了什么,请宽容

问候,, BARTZZ

< P>维基百科文章有一个链接,它实现了C++中的几种不同技术,包括:

  • 随机Karp-Rabin(有时称为Rabin-Karp)
  • 循环多项式散列(也称为Buzhash)
  • 不可约多项式散列

(也可)

< P>维基百科文章上有一个链接,实现了C++中的几种不同技术,包括:

  • 随机Karp-Rabin(有时称为Rabin-Karp)
  • 循环多项式散列(也称为Buzhash)
  • 不可约多项式散列

(也可从上获得)

您所描述的内容与重复数据消除存储中使用的基本方法非常接近

在重复数据消除系统中,我们通常使用的方法是快速、滚动的哈希函数。 然而,尽管拉宾指纹具有良好且众所周知的碰撞特性,但它在加密方面并不安全,也就是说,将发生碰撞。检查,例如如何检查。问题是你是否能容忍碰撞,以及能容忍多少碰撞。如果您能够容忍偶尔的碰撞,那么一个好的Rabin指纹实现可能是一个好主意。好的实现可以在每个核心每秒处理200 MB以上的数据

我不知道有哪种方法几乎没有冲突(也称为加密安全)并同时滚动。作为Plasmah,我非常怀疑这是否真的可能


想想你是否可以放松你的限制。也许你可以允许错过一些副本。在这些情况下,更快的方法是可能的。

您描述的方法与重复数据消除存储中使用的基本方法非常接近

在重复数据消除系统中,我们通常使用的方法是快速、滚动的哈希函数。 然而,尽管拉宾指纹具有良好且众所周知的碰撞特性,但它在加密方面并不安全,也就是说,将发生碰撞。检查,例如如何检查。问题是你是否能容忍碰撞,以及能容忍多少碰撞。如果您能够容忍偶尔的碰撞,那么一个好的Rabin指纹实现可能是一个好主意。好的实现可以在每个核心每秒处理200 MB以上的数据

我不知道有哪种方法几乎没有冲突(也称为加密安全)并同时滚动。作为Plasmah,我非常怀疑这是否真的可能


想想你是否可以放松你的限制。也许你可以允许错过一些副本。在这些情况下,更快的方法是可能的。

好的散列函数(导致统计上适当数量的冲突)的一个特性是,它们的最终值取决于混合/全部/输入数据的位,即在下一数据块的每个处理步骤中计算,结果取决于迄今为止已处理的所有位。如果现在您想“仅仅”省去前N位,这意味着所有后续计算步骤所依赖的数据是不同的,因此所有步骤都必须重做。因此,你必须至少放弃今天好的散列函数的这种强度。好的散列函数的一个特性(导致统计上适当数量的冲突)是,它们的最终值取决于混合/全部/输入数据的位,即在下一个数据块的每个处理步骤中的计算,结果取决于迄今为止已处理的所有位。如果现在您想“仅仅”省去前N位,这意味着所有后续计算步骤所依赖的数据是不同的,因此所有步骤都必须重做。所以你至少要放弃今天好的散列函数的优势。有用的链接,至少我可以尝试现有的实现。谢谢有用的链接,至少我可以尝试现有的实现。谢谢谢谢我会试试拉宾指纹法,希望它足够好。我真的不想错过比我更多的副本(因为块大)。但是,在发生冲突的情况下,磁盘访问的成本可能会低于哈希性能增益。Rabin-Karp方法确实执行得很好,并且当在64位算术中实现时,对于这项任务来说,很少发生冲突。非常感谢!谢谢我会试试拉宾指纹法,希望它足够好。我真的不想错过比我更多的副本(因为块大)。但是,在发生冲突的情况下,磁盘访问的成本可能会低于哈希性能增益。Rabin-Karp方法确实执行得很好,并且当在64位算术中实现时,对于这项任务来说,很少发生冲突。非常感谢!