字符串hash方法
字符串 h a s h hash hash 就是把一个字符串映射成一个非负整数。
(同时碰撞的概率极低)
设计一个较大质数 p p p,把字符串看作 p p p 进制数。(如 31 31 31, 131 131 131, 1331 1331 1331)
(想想为什么要用质数)
对于已知的字符串 s s s,我们有 h a s h hash hash 值为 H ( s ) \text{H}(s) H(s),那么我们在 s s s 后面增加一个字符 c c c 构成新的字符串 s + c s+c s+c,该串的 h a s h hash hash 值则为 H ( s ) ∗ p + ( c − ′ a ′ + 1 ) \text{H}(s)*p+(c-'a'+1) H(s)∗p+(c−′a′+1)。
如我们取 p = 131 p=131 p=131,对于字符串 ′ a b a c ′ 'abac' ′abac′, p p p 进制数为 ( 1 2 1 3 ) p (1~2~1~3)_p (1 2 1 3)p,即 h a s h hash hash 值为 1 ∗ p 3 + 2 ∗ p 2 + 1 ∗ p + 3 1*p^3+2*p^2+1*p+3 1∗p3+2∗p2+1∗p+3。此时我们的字符串更新为 ′ a b a c d ′ 'abacd' ′abacd′,那么我们的 ′ a b a c ′ 'abac' ′abac′ 需要左移一位, p p p 进制数变为 ( 1 2 1 3 0 ) p (1~2~1~3~0)_p (1 2 1 3 0)