字符串hash

来源:互联网 发布:智慧办公软件下载 编辑:程序博客网 时间:2024/05/18 13:30
常用的几个字符串hash法
•1. unsigned long long hash[N];
     hash[i]=hash[i-1]*p(自动取模)
解释:

unsigned long long hash[N];

定义一个unsigned long long类型的变量,它的范围是在[0, 2^64) 内,这就相当于,当数超不过2^64-1后,它会溢出!这就相当于一个数模2^64的过程。

那么hash函数可以理解为:

       hash[i]=(hash[i-1]*p)%(2^64)

P取一个大素数,一般习惯取1e9+7或1e9+9

安全指数:三星(所以并不是很安全)

 

•2. hash[i]=(hash[i-1]*p+idx(s[i]))%mod
解释:

这个之前已经提到过了。   

 hash[i]=(hash[i-1]*p+idx(s[i]))%mod

p取一个6到8位的素数,mod取一个大素数,一般取1e9+7或1e9+9
安全指数:四星 (还可以)
 
•3. 双hash

     hash1[i]=(hash1[i-1]*p+idx(s[i]))%mod1

     hash2[i]=(hash2[i-1]*p+idx(s[i]))%mod2

     pair<hash1,hash2>表示一个字符串!

解释:

double hash
即取两个mod值,mod1和mod2

 hash1[i]=(hash1[i-1]*p+idx(s[i]))%mod1

 hash2[i]=(hash2[i-1]*p+idx(s[i]))%mod2

 mod1一般取1e9+7,mod2一般取1e9+9为什么这么取?

1000000007和1000000009是一对孪生素数,取它们,冲突的概率极低!

安全指数:五星!(非常稳!)
 
小结:
•可以这么说,hash某种程度上就是乱搞,把hash函数弄的越没有规律越好,使得冲突的概率小到 大部分数据都卡不掉。
•如果你开心,你想triple hash,ultra hash,rampage hash… 都没有问题!

 但请注意,hash的维度越高,耗时越高,耗内存越大!一般情况下,single hash可以被hack掉,但double hash极难被hack掉, 用double hash足以解决问题

 

0 0