5

快速提问

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

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

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

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

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

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

我想对 url 进行编码以表现得像 youtube 一样不知道他们是如何做到的。

任何建议

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(例如/watch?v=02R0-1PWdEf)请求一个 id,您可以告诉页面对照包含视频 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

编辑2(2015.12.17):完全重写答案。原作很烂,写的时候不知道在想什么。

于 2012-09-15T15:47:43.520 回答
2

您的问题与其他 SO question 类似,其中包含一些优化的生成器功能以及您要解决的问题的清晰描述:

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

它将一次性为您提供代码、更好地理解性能问题以及更好地理解问题域。

于 2012-08-24T14:53:16.087 回答
1

不知道谷歌究竟是如何生成他们的字符串的,但这个想法真的很简单。创建一个类似的表:

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

现在,创建您的网址,如:

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

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

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

于 2012-08-24T14:55:33.250 回答
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 回答
0

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

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

并解码回来:

echo base_convert("21i3v9", 36, 10); // => "123456789"
于 2012-08-24T14:57:29.243 回答
-2

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

于 2012-08-24T14:55:08.193 回答