人生自古谁无死,留取丹心照汉青。——宋·文天祥《过零丁洋》 楠少博客 阅读文章 关于短网址短链接生成的算法问题 楠少 2020-07-07 6666666 8888888 短网址 摘要 这两天把 小七短链接 https://n-s.fun 的短网址生成算法重构了,源于一个无意中的想法。 生成短网址代码的方式有很多,其核心目的就是 唯一、 尽可能少的位数还原尽可能多的网址。 网上的... # 关于短网址算法问题 这两天把[小七短链接](https://n-s.fun "小七短链接")的短网址生成算法重构了,源于一个无意中的想法。 生成短网址代码的方式有很多,其核心目的就是 唯一、 尽可能少的位数还原尽可能多的网址。 网上的方法有很多,我估计多半都是互相抄的,或者本人愚钝,没能真正理解其中的奥秘。 有一种说法是将长网址进行md5加密得到长度为32的字符串,将其分成4段16进制8位数。然后和30位二进制全为1的进行与操作等等。 另外一种就是在大小写字母、数字这62个字符中随机取。 我更偏向于第二种。 改进前的代码: ``` PHP // 传入 $number 为十进制序号 $out = ""; $codes = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $len = strlen($codes); while ($number > $len-1) { $key = $number % $len; $number = floor($number / $len) - 1; $out = $codes{$key}.$out; } return $codes{$number}.$out; ``` 以上是之前的系统 生成编码的方法,在数据库中保留了一个十进制数(序号),每次生成后该数 +1,生成过程是将此十进制数按`$code`转换为62进制串。 此缺点是生成的串都为递增,容易被遍历出来,这也是我要重构的主要原因。 改进后: ``` PHP // 传入 $length 为随机串的长度 $strs = "23456789"; $strs .= "abcdefghijkmnpqrstuvwxyz"; $strs .= "ABCDEFGHJKLMNPQRSTUVWXYZ"; // 去掉了 容易混淆的 1lI 0oO $len = strlen($strs); echo $len; $random = ''; for ($i = 0; $i < $length; $i ++) { $random .= substr($strs, rand() % $len, 1); } return $random; ``` 在串的选择上,删掉了一些易混淆的字符,使得62进制变为56进制,当时这也足够了。 当前系统使用3位随机串 可生成`56^3=175616`个短链接,就我的需求而言,已经够用了。 ### End 上一篇:MAMP VirtualHost 无效 配置踩坑 下一篇:Nginx+php关联 文章评论 [ 聊聊技术 聊聊自己 ] 在巴甫洛夫条件反射 试验中:给定一条狗,每次摇铃后喂食,足够次数后,狗则听到铃声将会习惯性的分泌唾液,由此引发对铃声的依恋。延伸到实际,给定一个喜欢的妹子,每次见面赠与巴甫洛夫式 的礼品或者零食,由此引发妹子的依恋。引入薛定谔的猫 理论,在未表白前,妹子与自己一直处于一种“概率云”的状态,一旦表白则“概率云”将消失成为实际。在 巴甫洛夫式 后且未表白前,自己与妹子的关系为“既是恋人又不是恋人”的矛盾体。返回巴甫洛夫式 试验中,在妹纸形成足够的依恋过后,则可以打破薛定谔 “概率云”的状态。这个谜一样的自己,这一刻 薛定谔 附体,带着量子论般深沉的哀愁,让她从此不能自拔! 自此创作 巴甫洛夫薛定谔把妹法,深藏功与名。