youtube是如何对其网址进行编码的


How does youtube encode their urls?

快速问题

youtube如何对他们的网址进行编码?低于

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

他们在做什么来获得MhWyAL2hKlk 的价值

他们是在使用某种加密,然后在最后解密吗

我想要一些类似的东西,我正在工作的网站下面看起来很可怕。

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

我想把url编码成youtubes不知道他们是怎么做的。

任何建议

从技术上讲,YouTube通过使用算法生成视频ID。老实说,我不知道。它可以是整个视频文件的散列和+使用当前UNIX时间的salt,也可以是视频特有的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);
}

这是通过给定的charset生成一个随机字符串len个字符长。

以下是一些示例输出:

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

尽管使用这么短的字符集不是一个好主意。

randstr(30, "asdf")
sdadfaafsdsdfsaffsddaaafdddfad
adaaaaaafdfaadsadsdafdsfdfsadd
dfaffafaaddfdddadasaaafsfssssf
randstr(30)
r5BbvJ45HEN6dWtNZc5ZvHGLCg4Qyq
50vKb1rh66WWf9RLZQY2QrMucoNicl
Mklh3zjuRqDOnVYeEY3B0V3Moia9Dn

现在假设您已经告诉页面使用此函数为刚刚上传的视频生成随机id,现在您想将此密钥存储在一个表中,该表带有相关数据的链接,以显示正确的页面。如果通过$_GET(例如/watch?v=02R0-1PWdEf)请求id,您可以告诉页面根据包含视频id的数据库检查该密钥,如果找到匹配项,则从该密钥获取数据,否则给出404。

如果您不希望它是随机的,您也可以直接编码为64进制字符串。这可以用base64_encode()base64_decode()来完成。例如,假设您有一个字符串$str="filename=apples.avi;owner=coolpixlol124"中的视频数据,无论出于何种原因。base64_encode($str)会给你ZmlsZW5hbWU9YXBwbGVzLmF2aTtvd25lcj1jb29scGl4bG9sMTI0

若要稍后对其进行解码,请使用base64_decode($new_str),它将返回原始字符串。

不过,正如我之前所说,使用像SHA这样的哈希算法可能是一个更好的主意。

我希望这能有所帮助。

编辑:我忘了提一下,YouTube的视频id目前有11个字符长,所以如果你想使用同样的东西,你会想使用randstr(11)生成一个11位数的随机字符串,就像我得到的这个示例id:6AMx8N5r6cg

第2版(2015.12.17):完全重写答案。原来是垃圾,我不知道我写的时候在想什么。

您的问题与其他SO问题类似,该问题包含一些优化的生成器函数,并对您试图解决的问题进行了明确描述:

php-帮助提高这个youtube风格的url生成器的效率

它将同时为您提供代码、对性能问题的更好理解以及对问题域的更好理解。

不知道谷歌是如何生成它们的字符串的,但想法非常简单。创建一个类似于的表

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

现在,创建你的网址像:

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

在那之后,只需阅读比较你自己制作的代码与数据库url,并加载你的图像,视频或任何你想要的。

附言:这只是一个快速的例子。当然,这也可以通过许多其他方式来实现。

如果不想使用十进制数字,可以将它们编码为base36:

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

并解码回来:

echo base_convert("21i3v9", 36, 10); // => "123456789"
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/

只需使用一个自动递增的ID值(来自数据库)。尽管我个人喜欢长网址。