phpurlrandomuniqueshort-url

PHP random URL names (short URL)


After using sites like JSFiddle I noticed that they auto generate a random and unique URL made up of various upper and lower case characters.

We could benefit from this for our booking pages. How is it done?


Solution

  • This is not random, there based of the ID of your database record.

    How it works:

    basically you have a string that is unique but it can be decrypted to represent a number, you should look at it as a short encryption / decryption.

    You have a function that would take an unique ID and then it creates a Unique 'short string' from that id, and then you can reverse the process to get the unique id from the short string.

    Here's a snipped I have found of a website:

    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;
    }
    

    Example

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

    there's a link to the script here: https://github.com/kvz/deprecated/blob/kvzlib/php/functions/alphaID.inc.php