昨天看群里讨论哈希使用自然溢出被卡的问题,突然想到一个问题,就是为什么需要使用双模去做字符串哈希才能有效保证正确率呢?
把n个元素放进m个桶里面,不发生冲突的概率:
\[P = e^{\frac{-n(n-1)}{2m})
\]
求解这个式子可以得知,要求正确率达到1e-9级别的话,m大概需要n的平方的量级。但是经常发现1e9的取模会被卡,应该是有办法故意构造一些字符串让他冲突。
https://codeforces.com/blog/entry/60442
这里面讲述了为什么字符串哈希要选取质数作为模。也讲述了多种哈希策略及其对应的攻击方式。