Venkat加入新团队时,正赶上一次大规模重构。代码相当混乱,全靠一些超长的Python脚本粘在一起,主函数比托尔斯泰的小说还长。正是这次把代码整理成规整模块的努力,暴露出实现里的一些逻辑问题。
![]()
问题出在一个生成唯一标识的函数上。它来自一个启动脚本,这个脚本负责开通一台虚拟机来执行代码,而虚拟机需要一个唯一标识符,于是就用这个随机数来充当。
函数注释写得很清楚:生成一个5位随机数。实现是这样的——用random.sample从0到9的范围里取5个随机条目,再映射成字符串数组,最后拼接成一个输出字符串。
关键在于,Python里的random.sample是无放回抽样。也就是说,传入0到9的范围、要求取5个随机条目,取出来的数字不会重复。一个本可以容纳多达10万个可能值的范围,就这样被大幅压缩到3万左右——只剩下那些小于10万、且各位数字互不重复的数。
对大多数人来说,30240个唯一值大概够用了,毕竟同时要预留的虚拟机数量有限;如果不是在亚马逊或谷歌这类公司上班,多半没问题。但换个角度看,意外撞号的概率高得惊人:仅仅26次请求之后,就有1%的碰撞概率。而按照生日问题,大约206次请求就能达到50%的碰撞概率。这么一算,30240个值对谁来说可能都不够。
一个看似无害的“5位随机数”,因为抽样方式的选择,悄悄丢掉了近七成的取值空间。重构的意义,大概就在于让这类问题无处藏身。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.