私の計算が正しければ、各文字列の個別のハッシュ値が既にある場合は、2 つの文字列を連結するための新しいハッシュ値をすばやく生成できます。ただし、ハッシュ関数が次の形式の場合のみ:
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
has k=33
(またはおそらく31
?) をh(0) = 5381
機能させるために、h(0) = 0
代わりに設定することができます。
ただし、各キャラクターを追加するのではなく、DJB hash
用途を変更します。xor
+
http://www.cse.yorku.ca/~oz/hash.html
xor
ハッシュ関数が代わりに使用する場合、連結された文字列のハッシュ値をすばやく計算する別の手法はあり+
ますか?