5

簡単な質問

YouTubeはどのようにURLをエンコードしますか?以下をご覧ください

http://www.youtube.com/watch?v=MhWyAL2hKlk

値MhWyAL2hKlkを取得するために彼らは何をしていますか

彼らはある種の暗号化を使用していて、最後に復号化していますか

私が取り組んでいる以下のウェブサイトと似たようなものがひどいように見えます。

http://localhost:8888/example/account_player/?playlist=drum+and+bass+music

YouTubeがどのようにそれを行うのかわからないように動作するようにURLをエンコードしたいと思います。

何かアドバイス

4

6 に答える 6

4

技術的に言えば、YouTubeはアルゴリズムを使用してビデオIDを生成します。正直なところ、私にはわかりません。これは、ビデオファイル全体のハッシュサム+現在のUNIX時間を使用したソルトである場合もあれば、ビデオに固有の何かのbase64エンコーディングである場合もあります。しかし、ランダムではない可能性が高いことを私は知っています。ランダムである場合、衝突のリスクが高すぎるためです。

ただし、例として、YouTubeがランダムなIDを生成すると仮定します。ランダムに生成された値を使用して何かを格納する場合は、通常、衝突チェックを実装して、新しいオブジェクトが既存のオブジェクトを上書きしないようにすることをお勧めします。ただし、実際には、ハッシュアルゴリズムを使用することをお勧めします。ハッシュアルゴリズムは一方向であり、衝突を防ぐのに非常に効果的だからです。

ですから、私はPHPにあまり詳しくありません。最初にJavaScriptで書かなければなりませんでした。次に、それをPHPに移植しましたが、これは比較的単純であることがわかりました。

function randch($charset){
    return $charset[rand() % strlen($charset)];
}

function randstr($len, $charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-"){
    $out = [];

    for($i = 0; $i < $len; $i++){
        array_push($out, randch($charset));
    }
    return join("", $out);
}

lenこれは、指定されたを介してランダムな文字列文字を生成しますcharset

出力例を次に示します。

randstr(5)              -> 1EWHd
randstr(30)             -> atcUVgfhAmM5bXz-3jgyRoaVnnY2jD
randstr(30, "asdfASDF") -> aFSdSAfsfSdAsSSddFFSSsdasDDaDa

このような短い文字セットを使用するのは良い考えではありませんが。

randstr(30, "asdf")

sdadfaafsdsdfsaffsddaaafdddfad
adaaaaaafdfaadsadsdafdsfdfsadd
dfaffafaaddfdddadasaaafsfssssf

randstr(30)

r5BbvJ45HEN6dWtNZc5ZvHGLCg4Qyq
50vKb1rh66WWf9RLZQY2QrMucoNicl
Mklh3zjuRqDOnVYeEY3B0V3Moia9Dn

ここで、この関数を使用してアップロードされたばかりのビデオのランダムIDを生成するようにページに指示したとします。次に、適切なページを表示するために、関連データへのリンクを含むテーブルにこのキーを格納します。$_GET(例)を介してIDが要求された場合/watch?v=02R0-1PWdEf、ビデオIDを含むデータベースに対してこのキーをチェックするようにページに指示できます。一致するものが見つかった場合は、そのキーからデータを取得します。それ以外の場合は、404を指定します。

ランダムにしたくない場合は、base64文字列に直接エンコードすることもできます。base64_encode()これはとで行うことができますbase64_decode()。たとえば、$str="filename=apples.avi;owner=coolpixlol124"何らかの理由で、ビデオのデータが1つの文字列に含まれているとします。base64_encode($str)あなたに与えるでしょうZmlsZW5hbWU9YXBwbGVzLmF2aTtvd25lcj1jb29scGl4bG9sMTI0

後でデコードするにはbase64_decode($new_str)、を使用します。これにより、元の文字列が返されます。

ただし、前に述べたように、のようなハッシュアルゴリズムを使用することをお勧めしますSHA

これがお役に立てば幸いです。

編集:私は言及するのを忘れました、今のところYouTubeのビデオIDは11文字の長さなので、同じ種類のものを使用したい場合は、randstr(11)私が得たこのサンプルIDのように11桁のランダムな文字列を生成するために使用したいと思います:6AMx8N5r6cg

編集2(2015.12.17):回答を完全に書き直しました。オリジナルはがらくたでした、私がそれを書いたときに私が何を考えていたかはわかりません。

于 2012-09-15T15:47:43.520 に答える
2

あなたの質問は、あなたが解決しようとしている問題の明確な説明とともにいくつかの最適化されたジェネレーター関数を含むこの他のSO質問に似ています:

php-このyoutubeスタイルのURLジェネレーターの効率を改善するのに役立ちます

これにより、コード、パフォーマンスの問題の理解、および問題のドメインの理解が一度に得られます。

于 2012-08-24T14:53:16.087 に答える
1

どうやってグーグルが文字列を生成するのかわからないが、アイデアは本当に単純だ。次のようなテーブルを作成します。

+----------+------------------------------+
| code     | url                          |
+----------+------------------------------+
| asdlkasd | playlist=drum+and+bass+music |
+----------+------------------------------+

次に、次のようなURLを作成します。

http://localhost:8888/example/account_player/asdlkasd

その後、自分で作成したコードをデータベースのURLと比較して、画像や動画など、意図したものをロードしてください。

PS:これはほんの一例です。もちろん、他の多くの方法でも実行できます。

于 2012-08-24T14:55:33.250 に答える
0

10進数を使用したくない場合は、それらをbase36にエンコードできます。

echo base_convert(123456789, 10, 36); // => "21i3v9"

そしてデコードバック:

echo base_convert("21i3v9", 36, 10); // => "123456789"
于 2012-08-24T14:57:29.243 に答える
0
function alphaID($in, $to_num = false, $pad_up = false, $pass_key = null)
{
  $out   =   '';
   $index = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   $base  = strlen($index);

   if ($pass_key !== null) {

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

$pass_hash = hash('sha256',$pass_key);
$pass_hash = (strlen($pass_hash) < strlen($index) ? hash('sha512', $pass_key) : $pass_hash);

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

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

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

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

if (is_numeric($pad_up)) {
  $pad_up--;

  if ($pad_up > 0) {
    $out -= pow($base, $pad_up);
  }
}
} else {
// Digital number  -->>  alphabet letter code
if (is_numeric($pad_up)) {
  $pad_up--;

  if ($pad_up > 0) {
    $in += pow($base, $pad_up);
  }
}

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

return $out;
}
?>

この関数を使用して、暗号化または復号化できます。

<?php

$random_id=57256;
$encode=alphaID($random_id);
$decode=alphaID($encode,true); //where boolean true reverse the string back to original

echo "Encode : {$encode} <br> Decode : {$decode}";
?>

詳細については、以下をご覧ください。

http://kvz.io/blog/2009/06/10/create-short-ids-with-php-like-youtube-or-tinyurl/

于 2014-02-26T10:58:57.060 に答える
-2

(データベースからの)自動インクリメントID値を使用するだけです。私は個人的に長いURLが好きですが。

于 2012-08-24T14:55:08.193 に答える