首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确保UUID不被复制

如何确保UUID不被复制
EN

Stack Overflow用户
提问于 2013-09-09 23:17:33
回答 2查看 9.8K关注 0票数 1

我正在做一个视频共享项目,我想为每个视频生成“字符”id,类似于youtube是如何做到的。例如,tgax-1sCgIs

使用以下函数生成uuid安全吗?例如,如果我有100000000个视频,并且需要添加新的uuid,那么如何确保它不被复制?

代码语言:javascript
运行
复制
function generateRandomString($length = 11) {
    $characters = '0123456789abcdefghijklm-_nopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}
EN

回答 2

Stack Overflow用户

发布于 2013-09-09 23:24:55

如果您使用的是数据库,您可以使用以下几个选项:

  1. 只需使用存储视频的表的自动增量列即可。数字将永远是唯一的。
  2. 每次生成id时,请检查数据库是否存在。如果存在,请重新运行该函数以生成新的uuid并再次检查数据库.执行此操作,直到查询数据库而不返回带有该id的行为止。

在生成真正的uuid方面,您还应该查看其他一些更好的方法:

票数 1
EN

Stack Overflow用户

发布于 2013-09-09 23:53:18

我确信YouTube只是在基X系统中编码整数in。有这么多,他们创造得如此之快,以至于他们看起来是随机的。

代码看起来类似于:

代码语言:javascript
运行
复制
<?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;
}

示例输出:

代码语言:javascript
运行
复制
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之前,您只能对其进行一次置乱。

解码

我想这很重要,对吧?

代码语言:javascript
运行
复制
<?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);
}

示例输出:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18708496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档