Каков наилучший способ создания кодов для службы сокращения URL-адресов в PHP? - PullRequest
4 голосов
/ 19 февраля 2010

Я должен использовать этот способ для генерации кодов для службы сокращения URL

  $code = substr(md5(uniqid(rand(), 1)), 3, 5);

, но это всегда генерирует код фиксированной длины (в нашем случае 5).

что, если в базе данных есть большое количество URL, которые не могут выдержать пять символов здесь?

извините за плохой английский.

1 Ответ

8 голосов
/ 19 февраля 2010

Вам нужно будет сохранить URL, поэтому просто получите таблицу:

  • URL: id, url

где id - последовательность автоинкремента, а столбец url индексируется. Таким образом, каждый URL уникален. Самый простой способ - просто использовать идентификатор, но вы можете получить его короче.

Я бы посоветовал преобразовать идентификатор в основную 62 и обратно (10 цифр, 26 заглавных букв, 26 строчных букв = 62) или, возможно, 64 (добавить _ и -).

Под этим я подразумеваю 1234:

1 x 10 3 + 2 x 10 2 + 3 x 10 1 + 4 x 10 0

и есть довольно простой алгоритм для преобразования числа из формы в 10. Таким образом, базовый номер 62:

1234 (основание 10) = 19 х 62 1 + 56 х 62 0 = Jq

если моя математика верна.

Следующие функции должны делать то, что вам нужно.

$digits = range(0, 9) + range('A', 'Z') + range('a', 'z')

function from10($base10) {
  global $digits;
  $ret = '';
  $nd = count($digits);
  $n = $nd;
  while ($base10 > 0) {
    $r = $base10 % $n;
    $ret .= $digits[$r];
    $n = (int)($base10 / $n);
    $n *= $nd;
  }
  return $ret;
}

function to10($baseN) {
  global $digits;
  $nd = count($digits);
  $ret = 0;
  $n = $nd;
  for ($i=0; $i<strlen($baseN); $i++) {
    $ret += $n * $baseN[$i];
    $n *= $nd;
  }
  return $ret;
}

from10() конвертирует 1234 в "qJ" (надеюсь) и to10() конвертирует "qJ" в 1234, если моя математика не выключена.

Цифры на самом деле хранятся в обратном порядке (эквивалент «сто двадцать три» записывается как «321»), потому что с ними легче иметь дело, и нет необходимости, чтобы цифры были в каком-то определенном порядке. .

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