前段时间做一个解密程序,大致的模型可以描述如下:
有一种hash算法H,一个含有N条记录的明文字典,现要创建该字典针对H算法的全查表。对明文字典中的每一条记录P,得到其hash值S=H(P)。根据S的值对这N条记录进行排序,放在全查表相应的位置上,以便破解时迅速定位。
实际运行时发现,N条记录的位置发生大量冲突,当N很大时,有近40%的记录相应位置发生冲突。
这个问题等价于:
把N个球随机放到N个位置上,最后将有多少个位置上是空的?
解:
对任意一个位置,一次都没被访问到的概率是(N-1/N)^N=(1-1/N)^N,当N很大是,极限是1/e,大约是37%。即有1/e*N个位置上没有放到球,也就等于会有1/e*N次对已有位置的冲突访问。
于是这个全查表中的每条记录存储时,不得不增加一些位置信息。