如何减少碰撞概率,我觉得应该可以从三个方面考虑的:
1、增大 映射空间/原空间 的大小
这个很明显,映射空间/原空间 的比值大,碰撞的概率就可能小了。 前面我们也提到过,当这个比值大于等于1时,就可以实现无碰撞。
2、尽可能把原数据集均匀映射到较小空间
简单举个例子说明。比如有10个数,映射到5个位置。
如果每个位置均匀对应2个数,那么任意选2个数,碰撞概率为0.2.
如果1个位置对应6个数,其余4个位置各对应1个数,那么任意选两个数,碰撞概率为0.36.
3、结合原空间数据的数据特征
我们在处理原空间的数据集时,数据集一般都会有特征,而且不会是原空间的全集。换句话说,我们要处理的数据一般只会是原空间所有数据的一部分,而且数据集有一定特征(数据元素出现的概率的不同)。
一般哈希函数用质数取模这就是为了使得有特征的数据集也能均匀映射到映射空间。
在这种情况下,有时hash函数还要结合数据特征,让出现概率较大的数据集有较小的碰撞概率,出现概率较小的数据集有较大的碰撞概率。这样,就可以减少整体数据集的碰撞概率。