youtube如何编码他们的网址?

时间:2012-08-24 14:51:07

标签: php url encryption youtube

快速提问

youtube如何编码他们的网址?以下

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

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

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

我希望与我正在制作的网站类似的内容看起来很糟糕。

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

我想对网址进行编码,就像youtubes一样,不知道他们是怎么做的。

任何建议

6 个答案:

答案 0 :(得分:4)

从技术上讲,YouTube会使用算法生成视频ID。老实说,我不知道。它可以是整个视频文件的hashsum +使用当前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);
}

这样做会通过给定的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.

如果您不希望它是随机的,您也可以直接编码为base 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

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

答案 1 :(得分:2)

您的问题类似于其他SO问题,其中包含一些优化的生成器函数以及您尝试解决的问题的清晰描述:

php - help improve the efficiency of this youtube style url generator

它将为您提供代码,更好地理解性能问题,并且一次性更好地理解问题域。

答案 2 :(得分:1)

Dunno究竟google如何生成他们的字符串,但这个想法非常简单。创建一个表格,如:

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

现在,创建您的网址:

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

之后,只需阅读将您自己制作的代码与数据库网址进行比较,然后加载您的图片,视频或任何您想要的内容。

PS:这只是一个快速的例子。当然,它也可以通过许多其他方式完成。

答案 3 :(得分:0)

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

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

然后解码:

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

答案 4 :(得分: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/

答案 5 :(得分:-1)

只需使用自动增量ID值(来自数据库)。虽然我个人喜欢长URL。