Как отобразить (большое) целое число на (маленькое по размеру (буквенно-цифровая строка с PHP? (Кантор?) - PullRequest
3 голосов
/ 08 июня 2010

Я не могу понять, как оптимально сделать следующее в PHP: В базе данных у меня есть сообщения с уникальным идентификатором, например 19041985. Теперь я хочу сослаться на эти сообщения в сервисе коротких URL, но неиспользуя сгенерированные хэши, но просто «вычислите» исходный идентификатор.

Другими словами, например: http://short.url/sYsn7 должен позволить мне рассчитать идентификатор сообщения, который посетитель хотел бы запросить.1006 * Чтобы сделать это более очевидным, я написал следующее в PHP, чтобы сгенерировать эти «буквенно-цифровые версии идентификаторов», и, конечно, наоборот, позволит мне вычислить исходный идентификатор сообщения.1009 * Это оптимальный способ сделать это? Я так не думаю, но больше ничего не могу придумать.

$alphanumString = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_';
for($i=0;$i < strlen($alphanumString);$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}



$id = 19041985;

$out = '';
for($i=0;$i < strlen($id);$i++) {

 if(isset($alphanumString["".substr($id,$i,2).""]) && strlen($alphanumString["".substr($id,$i,2).""]) > 0) {
  $out.=$alphanumString["".substr($id,$i,2).""];
 } else {
  $out.=$alphanumString["".substr($id,$i,1).""];
  $out.=$alphanumString["".substr($id,($i+1),1).""];
 }
 $i++;
}

print $out;

Ответы [ 2 ]

1 голос
/ 08 июня 2010
echo trim(base64_encode(pack("L", 19041987)), "=");
print_r(unpack("L", base64_decode("w44iAQ")));
  • Пакет изменяет число на четыре байта, что очень мало, но не читается.
  • Base64_encode изменяет четыре байта на некоторые более понятные человеку символы.
  • Добавляет некоторые = символы, которые не нужны.

Если вы выполните base64_encode (19041987), вы получите кодировку для строки "19041987", которая не короче.

0 голосов
/ 08 июня 2010

Никогда не следует использовать функцию внутри оператора for, поскольку она воспроизводится во время каждого цикла.

Например, ваш

for($i=0;$i < strlen($alphanumString);$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}

должен быть

var $alphaLength = strlen($alphanumString);
for($i=0;$i < $alphaLength;$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...