【学习笔记】哈希/Hash
hash
何为哈希
哈希,就是将字符串变成数字。
即:Hash 的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。
当 Hash 值不一样的情况,他们一定不一样。
反之亦然。
单哈希
实际上就是前缀和的变种。
\(hash_i = hash_{i-1} + ASCII(s_i)\)
对于这个显然的式子,我们发现:
"ab" = (a) + (b)
"ba" = (a) + (b)
其中 (i) 表示 i 的 ASCII 码。
他们是一样的,显然是错误的,不满足之前所说。
但是我们可以增加一个权重:
hash = (s[1]) * p^(n-1) + (s[2]) * p^(n-2) + ... + (s[n])
现在就不同了。
我们可以发现:这其实就是一个 \(p\) 进制数。
假如 a -> 1 b -> 2
那么:
ab 就是 12,ba 就是 21。
比如 p = 10
12 = 1×10 + 2
21 = 2×10 + 1
不一样。
因此这就是 多项式哈希(单哈希)
双哈希
我们看到之前的式子:假如 mod 是 \(10^9+7\)。
那么,假如进行 \(10^5\) 次运算,那么他一次碰撞的概率是多少?
乍一看应该是 n/mod,但是我们只考虑了两个相同的概率。
可以参考生日悖论
我们有 \(C_2^n\) 个配对方法,每一个都是 \(\frac{1}{10^9}\) 的概率
\(C_2^n\) 约等于 \(\frac{n^2}{2}\) 再乘上 \(\frac{1}{10^9}\) 就是 \(\frac{n^2}{2 \times 10^9}\)
\(n = 10^5\) 就是 \(\frac{10^{10}}{2 \times 10^9}\) 就是 \(5\),期望有五对冲突,也就是肯定有冲突。
所以单哈希有大约 \(100\%\) 的概率被万恶善良的出题人卡爆。
但是,我们可以用两个 \(mod\),这样冲突概率就是:
即:
\[\frac{10^{10}}{2 \times 10^9 \times 10^9} \]那么就是 \(5 \times 10^{-9}\),完全可以忽略
只有在两个都完全相同时,才是一样的。

浙公网安备 33010602011771号