关于短网址短链接生成的算法问题
关于短网址算法问题
这两天把小七短链接的短网址生成算法重构了,源于一个无意中的想法。
生成短网址代码的方式有很多,其核心目的就是 唯一、 尽可能少的位数还原尽可能多的网址。
网上的方法有很多,我估计多半都是互相抄的,或者本人愚钝,没能真正理解其中的奥秘。
有一种说法是将长网址进行md5加密得到长度为32的字符串,将其分成4段16进制8位数。然后和30位二进制全为1的进行与操作等等。
另外一种就是在大小写字母、数字这62个字符中随机取。
我更偏向于第二种。
改进前的代码:
// 传入 $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进制串。
此缺点是生成的串都为递增,容易被遍历出来,这也是我要重构的主要原因。
改进后:
// 传入 $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
个短链接,就我的需求而言,已经够用了。
博客:https://blog.nanshaobit.top/99
End
个人博客: | https://blog.nanshaobit.top |
CSDN: | https://blog.csdn.net/LZ_nanshao |
码云: | https://gitee.com/nanshaobit |
Github: | https://github.com/nanshaobit |