> 文档中心 > 聪明如我,一眼就看穿了快递小哥的分堆算法

聪明如我,一眼就看穿了快递小哥的分堆算法

事情是这样的。

最近不是疫情嘛,小区的快递驿站关了几天,得给这些快递们做核酸检测。

那些快递小哥把快递也放不进驿站,也进不来小区,就只能在小区门口摆摊,然后打电话通知大家来取快递。

于是我收到小哥打给我的电话:

然后我就起身出门了。

嗖的一下,很快啊,就到小区门口了。

就看到一个快递小哥站在一堆快递前,不停的分类。

然后我给他说:老哥,我来取快递。

他问我:手机尾号多少呀?

我答:尾号是 8。

然后他走向了一地包裹里面最长的那一溜,说:在这一堆里面,有点多,你稍等一下,我给你找一找。

然后他就从第一个开始翻。

聪明如我,一下就搞懂了他的快递分堆原理。

这不就是根据手机尾号进行 Hash 计算嘛。尾号相同的放在同一列里面,方便客户来取。

这就是个长度为 10 的数组加链表,这玩意不就是一个简陋的 HashMap 吗?

HashMap

好巧不巧的,我这尾号为 8 的快递明显比别的快递多的多,简直都堆成山了。

我问他:这一堆快递怎么这么多呀?我们小区手机尾号是 8 的人这么多吗?

小哥边找边说:不止你们这个小区哦,这附近小区的快递都在这里,所以看起来很多。

当时我心里就在想:那这个 HashMap 定义的不合理啊。应该先按照小区的维度划分一下。

HashMap<小区,HashMap>

于是我问小哥:为啥子不(怎么不)先根据小区的维度 Hash 一把(次)呢?

很明显,小哥一愣,没听懂我在说什么。

于是我改了一下说法:为啥不先分小区,再把小区里面的快递按照手机尾号进行划分呢?

小哥想也没想的用标准的四川话回复我:哎呀,人手不够的嘛,我分堆堆的时候还要看小区,恼火的很。哦,你莫急,我很快就找到你的了,莫 ~ 急 ~

就在我们聊天的空档,我后面已经排了三个等着取快递的人了:

又过了半分钟,小哥一看尾号为 8 的快递还得找一会,就对我说:老弟,这样嘛,你稍等一下下,我先把后面的人找一下,他们的应该很快。不耽误时间哈,莫 ~ 急 ~

我当然说没问题了,虽然我很赶时间,这个快递属于拿到马上就要用的那种,但是我还是非常理解这些小哥哥们的,等一会嘛,问题不大。

于是在小哥给其他人取快递的空档,我还在思考:他这个数据结构不够优秀啊。漏洞很多嘛,比如,处理不了我的请求。系统抗击打能力很拉胯啊。

就在我思考的时候,其他三个人的快递,果然很快就找到了,毕竟他们的尾号对应的快递一共也没几个。

小哥接着找我的快递,没想到我的快递居然在这个队列的最后几个。相当于是把一个长链表从头遍历到尾了。时间复杂度,不容乐观。

很明显,小哥找到我的快递的时候,露出了一丝不易察觉的微笑,仿佛在宣告着他的胜利。

在回家的路上,我就在思考。

如果我是这个小哥的竞争对手,基于他现在这么简单的分类方法,我完全可以对他进行攻击啊。

比如,我去找一堆尾号为 8 的电话卡,然后某宝上下单非常便宜的东西,并指定快递运营商。那他岂不是直接就处理不了尾号为 8 的客户的快递了,至少处理的时候得花一阵时间。

这样,来取快递的用户等的时间长了,心里就不爽了,然后点个投诉啥的...

额,等等...

这玩意,不就是我之前写过的...

这篇《悄悄的给你说几个HashCode的破事。》里面提到的 hash 冲突攻击大法?

这真是,处处留心皆学问啊。

想到这,我不经为自己的聪明才智所拍掌叫好,想着快点回去向我的老婆汇报我的发现,一定会得到她崇拜的目光。

于是还不由的加快了步伐。

回到家后,我推门就汇报了这次惊人的发现,老婆反问一句:那岂不是菜鸟驿站也有同样的问题?

一时间,竟然把我问兴奋了:是啊,如果菜鸟驿站也有这样的问题,那我反馈一下,岂不是提升了他们的工作效率。再这么也得在全小区通报表扬一下吧?

但是,等我冷静下来后,我发现是我想的太简单了,菜鸟驿站的包裹放置逻辑肯定不是按照手机尾号 Hash 这么简单的算法来的呀?

比如我看了一下我之前的取件码,它是这样的:

我知道它的含义是 2 号货架第 1 层 5006 号包裹。

但是 2-1-5006 这个号是由它们系统生成的,具体是怎么生成的,我也不知道。

由于不知道他们的生成规则,那部分攻击这条路肯定是走不通的。

注意,为什么我这里要强调“部分攻击”呢?

因为我可以直接发起暴力的 DDos 攻击啊,疯狂的下单,让驿站处理不了这么大的订单量。比如你想想每年的双 11 不就是一次 DDos 攻击吗。

就像是在斯大林格勒战场上,李云龙带动晋西北,攻打整个平安县城一样,怒气值上来之后,直接就是火力全面覆盖。

而 Hash 攻击,应该是像水门桥战役一样,就猛攻水门桥这一个点,单点打爆,也能影响到整个战斗局势的走向。

好了,就写到这吧。

我已经迫不及待的打开这个包裹了,我前面说了,这个快递属于拿到马上就要用的那种,可以两个人一起用,然后让人很兴奋的那种。

因为里面是这个玩意:

买来玩个《双人成行》,她用手柄,我用键盘:

这个游戏的设计非常巧妙,两个人一起玩的时候,经常是玩的很兴奋。