雜湊是把一個序列對映成一個數字
令這個序列為 \(a\), 最大數字為 \(b - 1\), 長為 \(n\)
這個數字
\[a_1 \cdot b^{n - 1} + a^2 \cdot b^{n - 2} \dots a_n \cdot b^{0}
\]
這就是這個序列的 \(hash\) 值, 不過這個數字比較大, 所以需要模上一個數 \(p\)
\(hash\) 有什麼好處\(?\) \(O(1)\) 比較兩個序列是否相同
有些序列雖然不同,但是 \(hash\) 在取模意義下相同, 如 \(4 \equiv 11 \pmod 7\)
如果模數為 \(10^9 + 7\), 有 \(10^5\) 個元素, 發生這種情況的機率極大, 詳見生日悖論 。
如何避免這些麻煩了, 這裡解釋兩種解決方法, 可以大大減低機率, 不過還是能被特殊資料 \(hack\)。
-
加大模數, 推薦 \(10^{18} + 3\)
-
用多雜湊
- 就是節錄多個不一樣的 \(b, p\) 只要所以的 \(b, p\) 都在取模意義下相等, 才算它們相等
貼一份質數表