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


    关于短网址算法问题

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

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

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

  • 相关阅读:
    angularJS获取json数据(实战)
    HTML中使背景图片自适应浏览器大小
    实现table的单线边框的办法
    [转载]姑娘,你为什么要编程呢?
    可拖拽和带预览图的jQuery文件上传插件ssiuploader
    table布局的简单网页
    3D立体照片墙
    五一假期安排
    有点小迷惘
    一直都不明白,现在还是木有明白,那些人,那些事——残念
  • 原文地址:https://www.cnblogs.com/nanshaobit/p/13258945.html
Copyright © 2020-2023  润新知