字符串hash(类似于进制的hash)
Posted quicksilverx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串hash(类似于进制的hash)相关的知识,希望对你有一定的参考价值。
分段字符串哈希方法
对于一串字符串 $orztrj$ ,我们有一种哈希的方法,该串哈希值为:
$((((o * base + r) * base + z) * base + t) * base + r) * base + j$
即
$o * base^5 + r * base^4 + z * base^3 + t * base^2 + r * base^1 + j * base^0$
其中 $base$ 设成一个素数,记得取模
于是哈希数组如下:
$hash[1] = o * base^0$
$hash[2] = o * base^1 + r * base^0$
$hash[3] = o * base^2 + r * base^1 + z * base^0$
$hash[4] = o * base^3 + r * base^2 + z * base^1 + t * base^0$
$hash[5] = o * base^4 + r * base^3 + z * base^2 + t * base^1 + r * base^0$
$hash[6] = o * base^5 + r * base^4 + z * base^3 + t * base^2 + r * base^1 + j * base^0$
当我们判一个串 $deep$ 是否是它的子串时,我们进行一个一个比对
比较 $deep$ 和 $ztrj$ , 此时$l = 3,r = 6$,要得出 $ztrj$ 的哈希值,我们只需算出 $hash[6] - hash[3-1=2] * base^{r-l+1}$ 就是答案。(类似与前缀和)
所以除了 $KMP$ 和 $STLstrcmp$ ,字符串 $hash$ 也不失为一种可行之法。
以上是关于字符串hash(类似于进制的hash)的主要内容,如果未能解决你的问题,请参考以下文章