【问题标题】:MySQL / PHP, but more of a MATH Question (Shortening Script)MySQL / PHP,但更多的是数学问题(缩短脚本)
【发布时间】:2011-09-20 23:03:45
【问题描述】:

对于我的最新项目,我需要缩短 URL,然后将其放入 mysql 数据库。 我现在遇到了一个问题,因为我不知道如何解决这个问题。基本上,缩短的字符串应该是这样的(我想包括小写字母、大写字母和数字)

a
b
...
z
0
...
9
A
...
Z 
aa
ab
ac
...
ba

所以,1. URl --> a.存储在 mysql 中。 下一次,一个新的 url 被存储到 --> b 因为 a 已经在 mysql 数据库中了。

就是这样。但我没有任何想法。有人可以帮帮我吗?

编辑:格式化和进一步解释。

这有点像 imgur.com 的 URL 缩短服务。它应该像这样一直持续到无穷大(我认为这不是必需的......)

【问题讨论】:

  • 我没有完全理解你在问什么。您应该将缩短的 URI 视为 base-62 数字,然后考虑如何编写将十进制数字转换为 base-62 表示的函数。
  • 我从未听说过 base-62。我会读一些关于它们的。
  • Base-62 仅表示您的数字系统有 62 个唯一数字。您听说过的常见系统包括十进制(base-10)和二进制(base-2)。有关更多信息,请查看 MathWorld 在 base 上的文章和维基百科在 radix 上的文章。

标签: php mysql math url-shortener


【解决方案1】:

您可以使用以下函数(code adapted from my personal framework):

function Base($input, $output, $number = 1, $charset = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    if (strlen($charset) >= 2)
    {
        $input = max(2, min(intval($input), strlen($charset)));
        $output = max(2, min(intval($output), strlen($charset)));
        $number = ltrim(preg_replace('~[^' . preg_quote(substr($charset, 0, max($input, $output)), '~') . ']+~', '', $number), $charset[0]);

        if (strlen($number) > 0)
        {
            if ($input != 10)
            {
                $result = 0;

                foreach (str_split(strrev($number)) as $key => $value)
                {
                    $result += pow($input, $key) * intval(strpos($charset, $value));
                }

                $number = $result;
            }

            if ($output != 10)
            {
                $result = $charset[$number % $output];

                while (($number = intval($number / $output)) > 0)
                {
                    $result = $charset[$number % $output] . $result;
                }

                $number = $result;
            }

            return $number;
        }

        return $charset[0];
    }

    return false;
}

基本上,您只需从表中获取新生成的自动递增 ID(这也确保您不会产生任何冲突)并将其传递给此函数,如下所示:

$short_id = Base(10, 62, $auto_increment_id);

请注意,第一个和第二个参数分别定义输入和输出基数。

另外,我已从“默认”0-9a-zA-Z 重新排序字符集以符合您的示例。

如果您可以不使用混合字母大小写(以 36 为基数),您也可以只使用 base_convert()

【讨论】:

  • @Thomas:没问题,很高兴为您提供帮助。 =)
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
相关资源
最近更新 更多