zoukankan      html  css  js  c++  java
  • 关于短网址短链接生成的算法问题

    关于短网址算法问题

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

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

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

  • 相关阅读:
    mysql批量插入数据的基类
    mount命令解析
    常用linux命令记录
    转载一篇大神的博客文章
    linux查看网卡状态
    centos7配置网卡绑定
    coentos7安装python3
    阿里云ecs 硬盘在线扩容
    centos7安装redis5
    centos7 rpm安装nginx
  • 原文地址:https://www.cnblogs.com/nanshaobit/p/13258945.html
Copyright © 2011-2022 走看看