转载自:http://www.cnblogs.com/jiu0821/p/4554352.htmlhtml
求一个字符串的hash值:安全
假设咱们取p=13 ,mod=101函数
先把abc映射为一个整数htm
hash[0]=1,表示 a 映射为1blog
hash[1]=(hash[0]*p+idx(b))%mod=15,表示 ab 映射为 15ip
hash[2]=(hash[1]*p+idx(c))%mod=97内存
这样,咱们就把 abc 映射为 97 这个数字了。字符串
hash值呢?hash
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
安全指数:三星(因此并非很安全)
这个以前已经提到过了。
hash[i]=(hash[i-1]*p+idx(s[i]))%mod
hash1[i]=(hash1[i-1]*p+idx(s[i]))%mod1
hash2[i]=(hash2[i-1]*p+idx(s[i]))%mod2
pair<hash1,hash2>表示一个字符串!
解释:
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的维度越高,耗时越高,耗内存越大!通常状况下,single hash能够被hack掉,但double hash极难被hack掉, 用double hash足以解决问题