ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

字符串Hash

2020-01-22 20:05:37  阅读:300  来源: 互联网

标签:Hash 哈希 int 质数 模数 ull 字符串 进制


一般的字符串哈希:我们设置一个进制\(x\),把这个串\(s\)看做一个\(x\)进制数。

\(Num=s1*x^0+s2*x^1+s3*x^2+s4*x^3+…\)

然后对一个比较大的质数取模。

这种\(hash\)方法在随机情况下冲突的概率比较小,除非对着哈希构造方法卡。

模数一般选用一个较大的质数来减小冲突的概率。

但在实践中可以发现使用自然溢出\((unsigned\ long\ long)\)的防冲突概率是最小的,毕竟这是一个\((2^{64})\)的模数。
所以最保险的哈希方法是自然溢出加上对大质数取模。

模数:\(1e9+7,1e9+9,19260817,998244353, 1e7+9, 1e7+7,5e5+9\)

进制数:\(131,13331\)

\(code\):

ull hashh(char s[])
{
    int l=strlen(s);
    ull num=0;
    for(int i=0;i<l;++i)
        num=num*base+(ull)s[i];
    return num&0x7fffffff;
}

\(code\):

ull f[maxn],bas[maxn];
for(int i=1;i<=n;++i)
{
    f[i]=f[i-1]*base+s[i]-'a'+1;//存储字符串从前往后的哈希值
    bas[i]=bas[i-1]*base;
}
bool check(int l1,int r1,int l2,int r2)
{
    return f[r1]-f[l1-1]*bas[r1-l1+1]==f[r2]-f[l2-1]*bas[r2-l2+1];//比较两段是否相同
}

标签:Hash,哈希,int,质数,模数,ull,字符串,进制
来源: https://www.cnblogs.com/lhm-/p/12229434.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有