用于URL的修改Base 64,或基于自定义字母表的Custom / Arbitrary“Base”,用​​PHP表示

时间:2011-03-10 21:05:26

标签: php math

我已经四处寻找了,但经过相当多的帖子筛选后,我还没有真正看到这个问题 -

我想通过提供“字母”来将无符号的,基数为10的整数转换为更高的“自定义”基数,但我不知道从哪里开始,并且可能忽略了简单性。

作为mentioned on wikipedia,传统Base 64的变体不会添加填充等,以便在URL和什么不使用,但我不知道如何开始实现它。 8 我不编码字符串或二进制数据 - 只是简单的整数 - 而希望能够将任意长的“字母”输入转换函数。当然,理想情况下,我也可以反转这些数字。

我正在使用PHP,但我应该能够使用简单的数学而不是很多自定义库来处理任何事情。

2 个答案:

答案 0 :(得分:1)

在这篇文章中,您可以找到一个函数来确切地询问(请参阅“创建超级压缩的URL”部分)Building a URL Shortener

基本上,这个功能:

  • 对整数进行编码,
  • 允许您使用任何字母

下面有一个反向功能; - )

答案 1 :(得分:0)

coded a function to do exactly this for phunction,这是独立版本:

function Base($number, $input, $output, $charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    if (strlen($charset) >= 2)
    {
        $input = max(2, min($input, strlen($charset)));
        $output = max(2, min($output, strlen($charset)));
        $number = ltrim(preg_replace('~[^' . preg_quote(substr($charset, 0, $input), '~') . ']+~', '', $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 = floor($number / $output)) > 0)
                {
                    $result = $charset[$number % $output] . $result;
                }

                $number = $result;
            }

            return $number;
        }

        return $charset[0];
    }

    return false;
}

以下是如何使用它:

var_dump(Base(1000, 10, 62)); // g8
var_dump(Base('g8', 62, 10)); // 1000

var_dump(Base(14776336, 10, 62)); // 10000
var_dump(Base('10000', 62, 10)); // 14776336

默认情况下,我使用的是基本62字符集,但您可以根据自己的需要进行更改。