字符串--字符串hash

字符串hash

就是把一个字符串转换成整数

可以理解成有一个函数,输入一个字符串,输出一个整数

而我们要做的就是构造这么一个函数,使得不同的\(x\)对应不同的\(y\)

首先我们选取一个\(base\)做为要转换的进制数,然后选取一个恰当的余数\(M\)(减少\(hash\)冲突)

code

int base = 27;
int M = 1e9+7;

int hash(string s)
{
    int len = s.size();
    int res = 0;
    for(int i = 0; i < len; i++) 
    {
        res = (res*base + (s[i]-'a'+1))%M;
    }
    return res;
}

注意事项

不要把任意字符对应\(0\),如果把\(a\)对应\(0\),那么\(ab\)\(b\)\(hash\)值相等,就造成了冲突

进制的选取,大于所有字符对应数字的最大值,不要含有模数的因子

模数尽量选取质数

也可以使用unsigned long long,当溢出时自动对\(2^{64}\)取模

ull hashs(char s[])
{
    int len=strlen(s);
    ull ans=0;
    for (int i=0;i<len;i++)
        ans=ans*base+(ull)s[i];        //自动溢出
    return ans&0x7fffffff;             //取正
}

求[l,r]的hash值

可以利用\(hash(r)-hash(l-1) \times base^{r-l+1}\)

比如说\(123456\),我要求\([3,5]\)\(hash\)

也就是用\(12345-12000 = 345\)

参考博客

https://www.cnblogs.com/bbqub/articles/11115673.html

posted @ 2020-01-15 10:33  hezongdnf  阅读(196)  评论(0编辑  收藏  举报