2024.3.26 雜湊

liuyichen發表於2024-03-26

雜湊是把一個序列對映成一個數字

令這個序列為 \(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\)

  1. 加大模數, 推薦 \(10^{18} + 3\)

  2. 用多雜湊

  • 就是節錄多個不一樣的 \(b, p\) 只要所以的 \(b, p\) 都在取模意義下相等, 才算它們相等

貼一份質數表

相關文章