关于短网址短链接生成的算法问题

关于短网址算法问题

这两天把小七短链接的短网址生成算法重构了,源于一个无意中的想法。

生成短网址代码的方式有很多,其核心目的就是 唯一、 尽可能少的位数还原尽可能多的网址。

网上的方法有很多,我估计多半都是互相抄的,或者本人愚钝,没能真正理解其中的奥秘。
有一种说法是将长网址进行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://www.cnblogs.com/nanshaobit/p/13258945.html