我正在做一个视频共享项目,我想为每个视频生成“字符”id,类似于youtube是如何做到的。例如,tgax-1sCgIs
使用以下函数生成uuid安全吗?例如,如果我有100000000个视频,并且需要添加新的uuid,那么如何确保它不被复制?
function generateRandomString($length = 11) {
$characters = '0123456789abcdefghijklm-_nopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
发布于 2013-09-09 23:24:55
如果您使用的是数据库,您可以使用以下几个选项:
在生成真正的uuid方面,您还应该查看其他一些更好的方法:
发布于 2013-09-09 23:53:18
我确信YouTube只是在基X系统中编码整数in。有这么多,他们创造得如此之快,以至于他们看起来是随机的。
代码看起来类似于:
<?php
$base_str = '0123456789abcdefghijklmnopqrstuvwxyz-_';
$base = strlen($base_str);
// generate a number if no input
if( ! isset($argv[1]) ) {
$number = rand(1000,1000000);
} else {
$number = intval($argv[1]);
}
printf("Input: %d\n", $number);
printf("Base: %d\n", $base);
// will hold the base-X encoded representation of the number
$repr = '';
for( $i=$number; $i>0; ) {
$remainder = $i % $base;
$digit_repr = substr($base_str, $remainder, 1);
$repr = $digit_repr . $repr;
printf("Rem: %2d Repr: %s Cur: %16d Progress: %s\n", $remainder, $digit_repr, $i, $repr);
$i = ($i - $remainder) / $base;
}
示例输出:
Input: 2000000
Base: 38
Rem: 22 Repr: m Cur: 2000000 Progress: m
Rem: 1 Repr: 1 Cur: 52631 Progress: 1m
Rem: 17 Repr: h Cur: 1385 Progress: h1m
Rem: 36 Repr: - Cur: 36 Progress: -h1m
如果您想在ID的外观中引入更多的“随机性”,您可以始终使用$base_str
。请记住,在开始编码ID之前,您只能对其进行一次置乱。
解码
我想这很重要,对吧?
<?php
$base_str = '0123456789abcdefghijklmnopqrstuvwxyz-_';
$base = strlen($base_str);
if( ! isset($argv[1]) ) {
$input = '-h1m';
} else {
$input = $argv[1];
}
printf("Input: %s\n", $input);
printf("Base: %d\n", $base);
$repr = str_split($input);
$number = 0;
for( $i=0; $i<count($repr); $i++) {
$number = $number * $base;
$value = strpos($base_str, $repr[$i]);
$number += $value;
printf("Char: %s Value: %2d Cur: %12d\n", $repr[$i], $value, $number);
}
示例输出:
Input: -h1m
Base: 38
Char: - Value: 36 Cur: 36
Char: h Value: 17 Cur: 1385
Char: 1 Value: 1 Cur: 52631
Char: m Value: 22 Cur: 2000000
https://stackoverflow.com/questions/18708496
复制相似问题