Skip to main content

字符串哈希

Summary

字符串哈希把字符串映射成一个整数,使字符串比较从逐字符降到 O(1)。常用多项式哈希:把串看作 base 进制数、对大质数取模,配合前缀哈希可在 O(1) 内取出任意子串的哈希值,从而快速判断两段子串是否相等。取较大的底数与大质数模数能降低不同串映射到同一值的冲突概率。实现给出一个以无符号长整型自然溢出、底数取 131 的哈希函数,可直接用于比较、去重与匹配。

参考资料​

简介​

字符串哈希(String Hashing)把字符串映射成一个整数,使字符串比较降到 O(1)O(1)。常用多项式哈希:把串看作 base\mathrm{base} 进制数,hash⁡(s)=∑isi⋅base∣s∣−1−i mod p\operatorname{hash}(s)=\sum_i s_i\cdot\mathrm{base}^{|s|-1-i}\bmod p。配合前缀哈希可 O(1)O(1) 取出任意子串的哈希值。取大质数模数与较大底数可降低冲突概率。

实现​

197 Bcpp
using ull=unsigned long long;
const int base=131;
const ull mod=212370440130137957;
ull get_hash(string s)
{
ull res=0;
for(int i=0;i<s.size();i++)
{
res=(res*base+s[i])%mod;
}
return res;
}

例题​

如题,给定 NN 个字符串(第 ii 个字符串长度为 MiM_i,字符串内包含数字、大小写字母,大小写敏感),请求出 NN 个字符串中共有多少个不同的字符串。

给定 nn 个字符串,判断不同的字符串有多少个。