Модифицированная база 64 для URL-адресов или пользовательская / произвольная «база» на основе пользовательского алфавита в PHP - PullRequest
2 голосов
/ 11 марта 2011

Я искал вокруг, но после просеивания довольно большого количества постов, я действительно не видел, что это покрыто -

Я бы хотел преобразовать целое число без знака, основанное на 10, в гораздо более высокое «пользовательское» основание, указав «алфавит», но я не уверен, с чего начать, и, вероятно, упускаю из виду простоту.

Как указано в википедии , существуют варианты традиционной Base 64, которые не добавляют заполнение и т. Д. Для использования в URL-адресах и т. Д., Но я не уверен, как начать реализовывать это. 8 Я не кодирую строки или двоичные данные - просто простые целые числа - и хотел бы иметь возможность передавать произвольно длинный алфавит в функцию преобразования . В идеале, конечно, я мог бы изменить и цифры.

Я использую PHP, но я должен уметь работать с чем угодно, используя простую математику и, конечно, не много пользовательских библиотек.

Ответы [ 2 ]

1 голос
/ 11 марта 2011

В этой статье вы можете найти функцию, точно отвечающую вашим запросам (см. Раздел «Создание суперсжатого URL-адреса») : Создание укороченного URL-адреса

В основном, эта функция:

  • Кодирует целое число,
  • Позволяет использовать любой алфавит , который вы хотите

А чуть ниже есть функция реверса; -)

0 голосов
/ 11 марта 2011

I закодировал функцию, чтобы сделать именно это для функции , вот автономная версия:

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

По умолчанию я использую кодировку base 62, но вы можете изменить это в соответствии со своими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...