对哈希函数的碰撞概念相当模糊,在网上搜原因,也没搜出个所以然来。去SegmentFault上面问了一下,这个人的回答还是很给力的(snailcoder)在这里再次感谢。
现在附上他的回答
-------------------------------------------------------我是切割线-------------------------------------------------------
你可以把hash想象成一个数组,现在你想把一个数据存到hash表中。那么问题来了:这个数据应该存到哪里?
于是,你需要一个hash函数,这个函数的作用就是把你要存的数据映射成hash表中的一个位置,这个位置就是你要存放该数据的地方。一般把hash表的每个位置都叫做“槽(slot)”,很形象,你要往槽里放数据。假如你要存的数据为k,存放在哪个槽里呢?很简单,存在hash(k)这个槽里。
这个hash函数是你自己选的。这里我以《算法导论》里面的一个题目举例:现在你选的hash函数是这样的:
hash(k) = k mod 9
假设hash表的大小为9(即有9个槽),现在要把一串数据存到表里:5,28,19,15,20,33,12,17,10
简单计算一下:hash(5)=5, 所以数据5应该放在hash表的第5个槽里;hash(28)=1,所以数据28应该放在hash表的第1个槽里;hash(19)=1,也就是说,数据19也应该放在hash表的第1个槽里——于是就造成了碰撞(也称为冲突,collision)。
解决冲突的方法有拉链法,开放定址法等,就不多说了