快速问题
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值(来自数据库)。尽管我个人喜欢长网址。