本文经why技术(id:hello_hi_why)授权转载如若转载请联系原公众号最近不是疫情嘛,小区的快递驿站关了几天,得给这些快递们做核酸检测。那些快递小哥送来的快递也放不进驿站,也进不来小区,就只能在小区门口摆摊,然后打电话通知大家来取快递。然后他走向了一地包裹里面最长的那一溜,说:在这一堆里面,有点多,你稍等一下,我给你找一找。这不就是根据手机尾号进行 Hash 计算嘛。尾号相同的放在同一列里面,方便客户来取。这就是个长度为 10 的数组加链表,这玩意不就是一个简陋的 HashMap 吗?好巧不巧的,我这尾号为 8 的快递明显比别的快递多得多,简直都堆成山了。我问他:这一堆快递怎么这么多呀?我们小区手机尾号是 8 的人这么多吗?小哥边找边说:不止你们这个小区哦,这附近小区的快递都在这里,所以看起来很多。当时我心里就在想:那这个 HashMap 定义的不合理啊。应该先按照小区的维度划分一下。HashMap<小区,HashMap<手机尾号,快递包裹>>
于是我问小哥:为啥子不(怎么不)先根据小区的维度 Hash 一把(次)呢?于是我改了一下说法:为啥不先分小区,再把小区里面的快递按照手机尾号进行划分呢?小哥想也没想地用标准的四川话回复我:哎呀,人手不够的嘛,我分堆堆的时候还要看小区,恼火得很。哦,你莫急,我很快就找到你的了,莫 ~ 急 ~就在我们聊天的空档,我后面已经排了三个等着取快递的人了:又过了半分钟,小哥一看尾号为 8 的快递还得找一会,就对我说:老弟,这样嘛,你稍等一下下,我先把后面的人找一下,他们的应该很快。不耽误时间哈,莫 ~ 急 ~我当然说没问题了,虽然我很赶时间,这个快递属于拿到马上就要用的那种,但是我还是非常理解这些小哥哥们的,等一会嘛,问题不大。于是在小哥给其他人取快递的空档,我还在思考:他这个数据结构不够优秀啊。漏洞很多嘛,比如,处理不了我的请求。系统抗击打能力很拉胯啊。
就在我思考的时候,其他三个人的快递,果然很快就找到了,毕竟他们的尾号对应的快递一共也没几个。小哥接着找我的快递,没想到我的快递居然在这个队列的最后几个。相当于是把一个长链表从头遍历到尾了。时间复杂度,不容乐观。很明显,小哥找到我的快递的时候,露出了一丝不易察觉的微笑,仿佛在宣告着他的胜利。如果我是这个小哥的竞争对手,基于他现在这么简单的分类方法,我完全可以对他进行攻击啊。比如,我去找一堆尾号为 8 的电话卡,然后某宝上下单非常便宜的东西,并指定快递运营商。那他岂不是直接就来不及处理尾号为 8 的客户的快递了,至少处理的时候得花一阵时间。这样,来取快递的用户等的时间长了,心里就不爽了,然后点个投诉啥的...想到这,我不禁为自己的聪明才智拍掌叫好,想着快点回去向我的老婆汇报我的发现,一定会得到她崇拜的目光。回到家后,我推门就汇报了这次惊人的发现,老婆反问一句:那岂不是菜鸟驿站也有同样的问题?一时间,竟然把我问兴奋了:是啊,如果菜鸟驿站也有这样的问题,那我反馈一下,岂不是提升了他们的工作效率。再怎么也得在全小区通报表扬一下吧?但是,等我冷静下来后,我发现是我想得太简单了,菜鸟驿站的包裹放置逻辑肯定不是按照手机尾号 Hash 这么简单的算法来的呀?我知道它的含义是 2 号货架第 1 层 5006 号包裹。但是 2-1-5006 这个号是由它们系统生成的,具体是怎么生成的,我也不知道。由于不知道他们的生成规则,那部分攻击这条路肯定是走不通的。因为我可以直接发起暴力的 DDos 攻击啊,疯狂地下单,让驿站处理不了这么大的订单量。比如你想想每年的双 11 不就是一次 DDos 攻击吗?就像是在斯大林格勒战场上,李云龙带动晋西北,攻打整个平安县城一样,怒气值上来之后,直接就是火力全面覆盖。而 Hash 攻击,应该是像水门桥战役一样,就猛攻水门桥这一个点,单点打爆,也能影响到整个战斗局势的走向。
程序员专属T恤
推荐阅读:
终于!我找到程序员爱穿卫衣的原因了
不靠乔布斯,苹果曾早 13 年做出了「iPhone」
有毒!为什么机械键盘用了就回不去了
大厂员工带宠物上班之后