hash函数冲突(碰撞)的原因

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011202188/article/details/45367817

对哈希函数的碰撞概念相当模糊,在网上搜原因,也没搜出个所以然来。去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)。

解决冲突的方法有拉链法,开放定址法等,就不多说了


阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页