【问题标题】:Generate a random unique ID using PHP使用 PHP 生成随机唯一 ID
【发布时间】:2014-05-26 18:36:53
【问题描述】:

我有一张看起来像这样的桌子。这是用户在我的网站上注册时的一些一般信息。

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

我只是想知道,您如何为user_id 生成一个随机的唯一 数字?假设数据库中还没有一个介于 1 到 100 之间的数字。我想使用 PHP 而不是 SQL 来完成这项工作。

【问题讨论】:

  • 您是在问如何使用 PHP 生成唯一 ID?
  • 为什么不简单的AUTO_INCREMENT 呢?那将是最好的选择。随机 ID 容易重复。
  • 在范围内选择一个随机数,测试它是否是唯一的,如果不重复,直到它是 BUT:确保它是一个未使用的范围内的数字
  • 我只是不希望 user_id 本身井井有条
  • 您必须更加具体。你为什么不希望它们井井有条?您想防止人们猜测什么是有效的用户 ID? (这作为安全措施的价值有限)。您希望拥有多少条记录?多大的值(字符/数字)合适?数据类型有什么限制?

标签: php sql random unique


【解决方案1】:

PHP Doc

注意此函数不会生成加密安全 值,不应用于加密目的。如果你需要 一个加密安全值,考虑使用 random_int(), random_bytes() 或 openssl_random_pseudo_bytes() 代替。

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

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

换句话说,如果您的脚本是在并行进程中运行的,您就有可能拥有相同的唯一 ID。所以我可以告诉你,没有办法拥有 100% 唯一的 id,但我们可以像使用其他函数一样增加概率: rand 和 more_entropy(uniqid 的第二个参数)

 $unique = uniqid (rand(), true);

不要忘记,我们只是在增加拥有唯一 id 的概率。

可能是 99.99% 的唯一性。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 将时间戳连接到您的方法是否有助于解决最小的部分?
    【解决方案3】:
    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();
     }
    

    【讨论】:

      【解决方案4】:

      首先,我同意@Shankar Damodaran,使用AUTO_INCREMENT 比使用随机ID 要好得多,因为如果您开始使用随机ID,那么您可能必须先检查该随机ID 是否已经存在并且然后随机选择一个并再次检查,直到你最终得到一个唯一的。

      如果你真的希望它是随机的,你可以使用 PHP 的 rand 函数:http://www.php.net/manual/en/function.rand.php

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我不会将 uniqid 称为“非顺序”。由于它基于服务器时钟,因此生成的每个 ID 都高于前一个。它是非增量的,但它仍然会泄漏信息。
        • -1 因为docs 声明:此函数不保证返回值的唯一性
        【解决方案6】:

        用php你可以做出这样的。

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

        【讨论】:

        • 确定只会生成唯一值吗?我不这么认为。
        • 提示,它可能不会。这个答案已经完成了一半,您仍然需要检查数据库以确保它是唯一的。
        猜你喜欢
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2010-12-11
        • 2013-07-12
        相关资源
        最近更新 更多