轉載自: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足以解決問題