【问题标题】:PHP URL Shortener errorPHP URL 缩短器错误
【发布时间】:2013-12-01 00:05:23
【问题描述】:

我有这个 PHP 代码,它应该在每个新条目上增加一个 URL 缩短掩码。 我的问题是它在碰到最后一个字符(z)时不会附加一个新字符。 (我知道递增是一个安全问题,因为您可以猜到前面的条目,但在这种情况下这不是问题)

如果我添加 00,它可以计算出 01 等等......但是有一个简单的解决方法可以解决为什么它不能自己做吗?

(参数是最后一个条目)

<?php

class shortener
{

    public function ShortURL($str = null)
    {
        if (!is_null($str))
        {
            for($i = (strlen($str) - 1);$i >= 0;$i--)
            {
                if($str[$i] != 'Z')
                {
                    $str[$i] = $this->_increase($str[$i]);
                    #var_dump($str[$i]);
                    break;
                }
                else
                {
                    $str[$i] = '0';
                    if($i == 0)
                    {
                        $str = '0'.$str;
                    }
                }
            }
            return $str;
        }
        else {
            return '0';
        }
    }

    private function _increase($letter)
    {
        //Lowercase: 97 - 122
        //Uppercase: 65 - 90
        //  0 - 9  : 48 - 57
        $ord = ord($letter);
        if($ord == 122)
        {
            $ord = 65;
        }
        elseif ($ord == 57)
        {
            $ord = 97;
        }
        else
        {
            $ord++;
        }
        return chr($ord);
    }
}

?>

【问题讨论】:

    标签: php


    【解决方案1】:

    实际上,您所做的只是将数字编码为 Base62。因此,如果我们获取字符串,将其解码为 base 10,将其递增,然后将其重新编码为 Base62,将更容易知道我们在做什么,并且字符串的长度会自行处理。

    class shortener
    {
      public function ShortURL($str = null)
      {
        if ($str==null) return 0;
        $int_val = $this->toBase10($str);
        $int_val++;
        return $this->toBase62($int_val);
      }
    
      public function toBase62($num, $b=62) {
        $base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $r = $num  % $b ;
        $res = $base[$r];
        $q = floor($num/$b);
        while ($q) {
          $r = $q % $b;
          $q =floor($q/$b);
          $res = $base[$r].$res;
        }
        return $res;
      }
    
      function toBase10( $num, $b=62) {
        $base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $limit = strlen($num);
        $res=strpos($base,$num[0]);
        for($i=1;$i<$limit;$i++) {
          $res = $b * $res + strpos($base,$num[$i]);
        }
        return $res;
      }
    }
    

    【讨论】:

    • 谢谢!你做的比我问的要多;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2010-10-31
    相关资源
    最近更新 更多