Случайные URL-адреса PHP (короткий URL) - PullRequest
9 голосов
/ 24 марта 2011

После использования сайтов, таких как JSFiddle, я заметил, что они автоматически генерируют случайный и уникальный URL, состоящий из различных символов верхнего и нижнего регистра.

Мы могли бы воспользоваться этим для наших страниц бронирования. Как это сделать?

Ответы [ 5 ]

20 голосов
/ 24 марта 2011

Это не случайно, там на основе идентификатора вашей записи базы данных.

Как это работает:

в основном у вас есть строка, которая является уникальной, но ее можно расшифровать для представлениячисло, вы должны рассматривать его как короткое шифрование / дешифрование.

У вас есть функция, которая будет принимать уникальный идентификатор, а затем она создает уникальную «короткую строку» из этого идентификатора, а затем вы можете обратитьпроцесс получения уникального идентификатора из короткой строки.

Вот фрагмент веб-сайта, который я нашел:

function alphaID($in, $to_num = false, $pad_up = false, $passKey = null)
{
    $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if ($passKey !== null)
    {
        /* Although this function's purpose is to just make the
        * ID short - and not so much secure,
        * with this patch by Simon Franz (http://blog.snaky.org/)
        * you can optionally supply a password to make it harder
        * to calculate the corresponding numeric ID */

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

        $passhash = hash('sha256',$passKey);

        $passhash = (strlen($passhash) < strlen($index)) ? hash('sha512',$passKey) : $passhash;

        for ($n=0; $n < strlen($index); $n++)
        {
            $p[] =  substr($passhash, $n ,1);
        }

        array_multisort($p,  SORT_DESC, $i);
        $index = implode($i);
    }

    $base  = strlen($index);

    if ($to_num)
    {
        // Digital number  <<--  alphabet letter code
        $in  = strrev($in);
        $out = 0;
        $len = strlen($in) - 1;

        for ($t = 0; $t <= $len; $t++)
        {
            $bcpow = bcpow($base, $len - $t);
            $out   = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
        }

        if (is_numeric($pad_up))
        {
            $pad_up--;
            if ($pad_up > 0)
            {
                $out -= pow($base, $pad_up);
            }
        }
        $out = sprintf('%F', $out);
        $out = substr($out, 0, strpos($out, '.'));
    }
    else
    {
        // Digital number  -->>  alphabet letter code
        if (is_numeric($pad_up))
        {
            $pad_up--;
            if ($pad_up > 0)
            {
                $in += pow($base, $pad_up);
            }
        }

        $out = "";
        for ($t = floor(log($in, $base)); $t >= 0; $t--)
        {
            $bcp = bcpow($base, $t);
            $a   = floor($in / $bcp) % $base;
            $out = $out . substr($index, $a, 1);
            $in  = $in - ($a * $bcp);
        }
        $out = strrev($out); // reverse
    }
    return $out;
}

Пример

alphaID(9007199254740989);   //-> PpQXn7COf
alphaID('PpQXn7COf', true);  //-> 9007199254740989

есть ссылка наскрипт здесь: https://github.com/kvz/deprecated/blob/kvzlib/php/functions/alphaID.inc.php

2 голосов
/ 24 марта 2011

Используйте функцию uniqid () , если вы просто хотите получить случайный идентификатор указанной длины, или используйте хэш md5 () вашего длинного URL, если вам нужно что-то повторяемое. (вывод всегда одинаков для данного входа). Создание службы коротких URL-адресов с использованием PHP и MySQL дает краткое изложение того, как все это собрать.

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

Что-то вроде этого:

<?php
  $url_length = rand(10,20); //generate a random number between 10 and 20 for the length   of the URL
  $url = array($url_length);
  for($i=0; $i < $url_length; $i++)
  {
     $char = 0;
     while($char < 65 OR $char > 122 OR ($char > 91 AND $char < 97))
     {
       $char = rand(65,122);
     }
     $url[] = chr($char);
  }
  print_r($url);
?>

Обратите внимание, что это частично псевдо-код. Это создает URL со случайной длиной (где-то между 10 и 20) и заполняет каждый символ случайным кодом ASCII, который соответствует букве в алфавите. В верхнем и нижнем регистре букв в таблице ASCII есть несколько «ненужных» символов, так что это будет перебирать случайное число, пока не будет сгенерировано правильное число ASCII.

Предполагается, что вы храните этот URL в базе данных. Чтобы убедиться, что эта строка уникальна, вам нужно проверить, существует ли она еще в базе данных. Если нет, то добавьте его, и все в порядке. Если он существует, повторяйте процесс еще раз, пока не получите уникальную строку.

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

Это очень просто.

Ваш URL-адрес похож на www.domain.com/in/here/RANDOMPART

Вы переписываете www.domain.com/in/here/*, чтобыскрипт на ваш выбор.В этом сценарии вы можете получить запрошенный URI с глобальными переменными, а также разделить его и использовать часть после последней '/'.Это ваш RANDOMPART.просто сравните его с вашей базой данных или чем-то подобным.

Чтобы создать такой URL-адрес, просто добавьте что-нибудь за "www.domain.com/in/here/".Вы можете создать красивую, надеюсь, уникальную строку с md5(uniqid(rand(), true)).

. Не забудьте сохранить эту строку в БД или в другом месте.

Надеюсь, это поможет.

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

Вы можете просто создать массив всех потенциальных символов, затем случайным образом выбрать сколько угодно, и вернуть их в виде URL-адреса «code»?

$arr = array('a','b','c','d');
$count = count($arr) - 1;
$str = $arr[rand(0, $coun)].$arr[rand(0, $coun)];
...