【学习笔记】哈希/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}\),完全可以忽略

只有在两个都完全相同时,才是一样的。

posted @ 2026-09-26 22:04  Axor  阅读(15)  评论(0)    收藏  举报