【发布时间】:2010-04-04 10:24:26
【问题描述】:
如果我的数学是正确的,如果我已经拥有每个字符串的单独哈希值,我可以快速为两个字符串的连接生成一个新的哈希值。但前提是散列函数的形式为:
hash(n) = k * hash(n-1) + c(n), and h(0) = 0.
在这种情况下,
hash( concat(s1,s2) ) = k**length(s2) * hash(s1) + hash(s2)
例如。
h1 = makeHash32_SDBM( "abcdef", 6 );
h2 = makeHash32_SDBM( "ghijklmn", 8 );
h12 = makeHash32_SDBM( "abcdefghijklmn", 14 );
hx = mod32_powI( 65599, 8 ) * h1 + h2;
h1 = 2534611139
h2 = 2107082500
h12 = 1695963591
hx = 1695963591
Note that h12 = hx so this demonstrates the idea.
现在,对于 SDBM hash k=65599。而DJB hash 具有k=33(或者可能是31?)和h(0) = 5381,因此您可以改为设置h(0) = 0。
但是对DJB hash 的修改使用xor 而不是+ 来添加每个字符。
http://www.cse.yorku.ca/~oz/hash.html
如果哈希函数使用xor而不是+,是否有另一种技术可以快速计算连接字符串的哈希值?
【问题讨论】: