使用PHP生成一个随机唯一的ID

4

我有一个表格长这样。这是用户在我的网站上注册时的一些常规信息。

+------------+------------+
|   user_id  | username   |
|   312543   |   Bobby    |
|   543765   |  Victoria  |
+------------+------------+

我在想,如何为user_id生成一个随机且唯一的数字呢?比如说,在1到100之间选择一个还没有被数据库使用过的数字。我希望使用PHP来实现这个功能,而不是SQL。


1
你是在问如何使用 PHP 生成唯一的 ID 吗? - Amal Murali
3
为什么不使用简单的AUTO_INCREMENT呢?那是最好的选择。随机ID容易出现重复。 - Shankar Narayana Damodaran
选择一个范围内的随机数,测试它是否唯一,如果不是,则重复此过程直到它是唯一的。但请确保在范围内有未使用的数字。 - AbcAeffchen
我只是不想要user_id本身 - Bono
你需要更加具体地说明。为什么你不想按顺序呈现?你是想防止人们猜测可能是有效用户ID吗?(这在安全措施方面的价值有限)。你预计会有多少条记录?适当的值有多大(字符/数字)?数据类型有哪些约束条件? - symcbean
6个回答

15

在 Niet the Dark Absol 的答案基础上改进:您可以使用 uniqid(rand())uniqid() 将根据您服务器的内部时钟生成一个数字,而 rand() 将在其前缀中添加一个随机数。因此,即使两个用户在同一极小的时间段内注册,rand() 前缀也会以超过 99.99999% 的概率为它们分配不同的前缀。


将时间戳连接到您的方法中是否有助于解决那个微小的部分? - Tilak Raj

5

您可以使用PHP的uniqid函数。它不是随机的(基于服务器时钟),但除非您有两个人在同一秒内注册,否则它将保证是唯一的,并且是非连续的。


1
我不会把uniqid称为“非顺序”的。因为它是基于服务器时钟生成的,每个生成的ID都比前一个更高。它不是递增的,但仍然泄露信息。 - DisgruntledGoat
1
-1,因为文档指出:此函数不保证返回值的唯一性。 - Kwebble

3

PHP文档

注意:该函数不能生成加密安全的值,不应用于加密目的。如果需要加密安全的值,请考虑使用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。

警告:该函数不能保证返回值的唯一性。由于大多数系统通过NTP或类似方式调整系统时钟,因此系统时间会不断变化。因此,该函数有可能无法为进程/线程返回唯一ID。可以使用 more_entropy 来增加唯一性的可能性。

 uniqid ([ string $prefix = "" [, bool $more_entropy = FALSE ]] ) :
 string

换句话说,如果您的脚本正在使用并行进程运行,那么您有可能会出现相同的唯一ID。因此,我可以告诉您没有办法实现100%的唯一ID,但我们可以增加概率,例如使用其他函数,如 rand 和更多的熵(uniqid的第二个参数)。
 $unique = uniqid (rand(), true);

不要忘记,我们只是增加了获得唯一 ID 的概率。

可能会有99.99%的唯一性。


1
function isUnique($var)
{
//we check here if var is unique, return TRUE on unique FALSE on non unique.
}

    //this is my function for generating random strings(can be used for numbers)
function _generateRandomString() {
    $chars = array_merge(range('a', 'z'), range(0, 9));
    shuffle($chars);
    return implode(array_slice($chars, 0,25));
}

  //actual code: 
$string= _generateRandomString();
while(!isUnique($string)) //if string is unique, while loop stops.
 {
 $string= _generateRandomString();
 }

1
首先,我同意@Shankar Damodaran的观点,使用AUTO_INCREMENT比使用随机ID要好得多,因为如果您开始使用随机ID,那么您可能需要先检查该随机ID是否已经存在,然后选择另一个随机ID并再次检查,直到最终获得唯一的ID。
如果您真的想要它是随机的,您可以使用PHP的rand函数:http://www.php.net/manual/en/function.rand.php

-2

使用 PHP 可以这样做。

$pattern = "1234567890";
$ID = $pattern{rand(0,10)};
for($i = 1; $i < 7; $i++)
{
    $ID .= $pattern{rand(0,10)};
}

你确定那只会生成独一无二的值吗?我认为不是这样。 - The Blue Dog
提示,它可能不会。虽然这个答案已经完成了一半,但你仍需要检查数据库以确保它是唯一的。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接