嗯,从技术上讲,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):完全重写答案。原作很烂,写的时候不知道在想什么。