字符串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)的主要内容,如果未能解决你的问题,请参考以下文章

HASH 字符串哈希 映射转化

字符串Hash总结(转载)

字符串hash算法

Redis 数据类型

POJ 1200Crazy Search(将字符映射为数字,将NC进制hash成10进制)

hashlib加密模块_python