我已经在PHP中实现了Adler32滚动哈希,但由于ord
非常慢(我的开发机器每秒大约1MB)来获取字符串中的chanters的整数值,这个解决方案是对于100MB +文件不可行。
PHP的mhash功能可以非常快速地计算adler32(我的开发机器每秒120MB)。但是mhash似乎不支持adler32的滚动特性,所以你必须在滚动窗口移动时计算一个全新的adler32,而不是仅重新计算实际改变的两个字节的散列。
我没有依赖于adler32算法,我只需要在PHP中使用非常快速的滚动哈希。
答案 0 :(得分:1)
调用Adler-32 A 的低两个字节和高两个字节 B ,其中是序列 {x1的Adler-32 ,x2,...,xn} 。
要获取 {x2,...,xn} 的Adler-32,请从 A 中减去 x1 ,模数为65521,并且从 B 中减去 n * x1 + 1 ,再次模数为65521。
请注意,如果您的窗口大小 n 恰好是65521的倍数,那么您只需从 B (模数65521)中减去一个。如果可以的话,这可能是一个很好的窗口大小。另请注意,如果 n 大于65521,则可以将 x1 乘以( n modulo 65521)。如果 n 是常量,则可以提前进行模数运算。
(请注意,C和PHP中的%
运算符不是模运算,而是余数运算。所以你需要注意负数。)