9

JSFiddle のようなサイトを使用した後、さまざまな大文字と小文字で構成されるランダムで一意の URL が自動生成されることに気付きました。

これは、予約ページに役立つ可能性があります。それはどのように行われますか?

4

5 に答える 5

20

これはランダムではなく、データベース レコードの ID に基づいています。

使い方:

基本的に、一意の文字列がありますが、復号化して数値を表すことができます。短い暗号化/復号化と見なす必要があります。

一意の ID を取得し、その ID から一意の「短い文字列」を作成する関数があり、プロセスを逆にして短い文字列から一意の ID を取得できます。

これは、私が見つけたWebサイトの抜粋です。

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

于 2011-03-24T16:19:17.910 に答える
2

指定した長さのランダムなIDが必要な場合は、uniqid()関数を使用します。繰り返し可能なものが必要な場合は、長いURLのmd5()ハッシュを使用します。(出力は、特定の入力に対して常に同じです)。PHPとMySQLを使用して短縮URLサービスを作成すると、すべてをまとめる方法の概要がわかります。

于 2011-03-24T16:08:38.187 に答える
1

とてもシンプルです。

あなたのURLはwww.domain.com/in/here/RANDOMPARTのようなものです

www.domain.com/in/here/* を任意のスクリプトに書き換えます。このスクリプトでは、要求された URI をグローバルで取得し、それを分割して最後の「/」の後の部分を使用できます。これがあなたの RANDOMPART です。あなたのデータベースなどに対してチェックしてください。

このような URL を作成するには、「www.domain.com/in/here/」の後ろに何かを追加するだけです。を使用して、うまくいけば一意の文字列を生成できますmd5(uniqid(rand(), true))

この文字列をデータベースなどに保存することを忘れないでください。

うまくいけば、それは役に立ちます。

于 2011-03-24T16:14:58.420 に答える
1

これらの行に沿ったもの:

<?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);
?>

これは部分的に疑似コードであることに注意してください。これにより、ランダムな長さ (10 から 20 の間) の URL が作成され、アルファベットの文字に対応するランダムな ASCII コードが各文字に入力されます。ASCII テーブルの大文字と小文字の間にいくつかの「ジャンク」文字があるため、有効な ASCII 番号が生成されるまで乱数が再ロールされます。

これは、この URL をデータベースに保存していることを前提としています。この文字列が一意であることを確認するには、データベースにまだ存在するかどうかを確認する必要があります。そうでない場合は、追加してください。存在する場合は、一意の文字列が得られるまでプロセスをやり直してください。

于 2011-03-24T16:15:09.767 に答える
0

可能性のあるすべての文字の配列を作成し、必要な数だけランダムに選択して、URL「コード」として返すことができますか?

$ arr = array('a'、'b'、'c'、'd');
$ count = count($ arr)-1;
$ str = $ arr [rand(0、$ coun)]。$ arr [rand(0、$ coun)];
于 2011-03-24T16:07:58.037 に答える