快速提问
youtube如何编码他们的网址?以下
http://www.youtube.com/watch?v=MhWyAL2hKlk
他们在做什么来获得价值MhWyAL2hKlk
他们是否正在使用某种加密,然后在最后解密
我希望与我正在制作的网站类似的内容看起来很糟糕。
http://localhost:8888/example/account_player/?playlist=drum+and+bass+music
我想对网址进行编码,就像youtubes一样,不知道他们是怎么做的。
任何建议
答案 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。