目录
好,那同学们这样他能达到一个目的,但是呢,它也会带来的一个问题,那它会带来一个什么问题呢?
同学们有没有听说一个叫做哈希冲突或者哈希碰撞。有听说过的同学可以给文章留言敲个1。
所以回答这个哈希算法的底层实现是:哈希冲突、哈希碰撞,这是不对的。
我们用到了取模,用到了位运算,所以才会导致哈希冲突、才会导致哈希碰撞。
同学们,我们认真来看看这里。我们还是通过这样一个方式,那我们现在在这里呢,我们还要存另外一个人的名字,
另外一个人的名字foes,那我们现在这个foes和lies呢,我们算出他们的ascii码呢,都是108、105、101、115,
那我们这几个值进行相加的话,这两个人的英文名字ascii码都是等于429,而我们现在这个数组的长度就等于10,
同样的一个情况下,就是我们的分子和分母都不改变的情况下,那我们算出的这个下标结果都是等于9吧。
这就是出现了哈希冲突(碰撞)了!
那同学我们来思考一下:
刚才我们这个数组,如果我们在这里定义为下标等于9,赋值数值为2,后面又赋值等于400,
那同学我想问一下,我取出来的这个值是多少?
我取出来的值最终只会是400,而这个2会被覆盖掉了。那为什么会覆盖掉呢?因为我们数组它每一个下标,它只能存一个元素。
所以在这里,为什么要用链表的原因?就是为了去解决这个哈希冲突的问题,
因为我们数组在一个下标下,它只会存一个节点,或者叫一个元素。但是在这里呢,我们又存两个人的key,而这两个人的key呢,
它又要符合我们 HashMap 的一个查询方式,就是说虽然他们底层的 ascii 都一样,但是这两个人的名字不一样,所以这两个人他都可以查询出来,
所以这就是为什么要用链表,链表就是去解决哈希冲突的问题。
好,那现在同学们,我们就已经了解哈希算法。包括我们哈希算法它底层的冲突问题,
包括我们哈希算法底层可以用MD5实现,也可以用哈希码实现,等等这些都可以实现。
包括同学们,我问大家有没有去学过那个叫做布隆过滤器,有没有同学听说过或者学过或知道。
他底层也跟这个有关啊,包括还有一个点,同学们我再给大家讲啊,就是经常去一些大公司去面试,比如像他这样说,
给你这个3到4TB的数据,然后这个数据里面存的都是手机号,请问如何去排查这3到4TB的这个数据里面,这个电话号码有重复的?
你怎么去做?那这个问题,其实他本质上也是哈希的问题。