3

为了生成唯一的 ID,我想我必须在 php.ini 中使用 uniqid 函数。
但是 uniqid 默认生成一个 13 位长的 HEXA 数字。

4f66835b507db

我想将此数字减少到 7 位长的 NUMERIC 数字,但我想保留唯一性。是否可以 ?

4974012  

此号码将用作用户 ID。身份验证将使用 id 和密码完成。

有人说uniqid不是唯一的!这是一个糟糕的选择吗?

4

6 回答 6

5

任何“唯一”数字在生成足够多的记录后最终都会发生冲突。为了确保唯一性,您需要将生成的值存储到数据库中,并且在生成下一个值时,您需要检查是否没有冲突。

但是,在实践中,应用程序通常将 ID 生成为简单的序列 1,2,3,... 这样您就知道在用完数据类型之前不会发生冲突(UINT 通常为 32 位长,这给出了你有 40 亿个唯一 ID)。

于 2012-04-27T12:37:05.030 回答
4

Uniqid不能保证是唯一的,即使是全长。

此外, uniqid 旨在仅在本地是唯一的。这意味着如果您在两台或多台服务器上同时创建用户,您最终可能会为两个不同的用户使用一个 ID,即使您使用全长 uniqid 也是如此

我的建议:

  • 如果您真的在寻找全局唯一标识符(即您的应用程序在具有单独数据库的多个服务器上运行),您应该使用UUIDs。这些甚至比 uniqid 返回的还要长,但实际上没有发生碰撞的机会。

  • 如果您只需要本地唯一标识符,请在数据库中坚持使用 AUTO_INCREMENT。这比检查数据库中是否已经存在短随机 ID (稍微)快一点并且(一点)安全。

编辑:正如下面的评论所示,您不仅在寻找用户的 ID,而且还被迫为您的用户提供一个随机登录名......这很奇怪,但没关系。在这种情况下,您可以尝试rand在循环中使用,直到您得到一个在您的数据库中不存在的。

伪代码:

$min = 1;
do {
    $username = "user" . rand($min, $min * 10);
    $min = $min * 10;
} while (user_exists($username));
// Create your user here.
于 2012-04-27T12:53:21.920 回答
1

编写一个 while 循环,生成所需长度的随机字母和数字,循环直到它创建一个尚未使用的 ID。

于 2012-04-27T12:37:28.577 回答
0

好吧,通过将其减少到 7 个字符并且只有数字,您将“唯一性”减少了很多。

我建议使用用户 ID 的自动增量,如果它必须是 7 位数字,则从 1000000 开始。

如果你真的必须在没有自动增量的情况下生成它,你可以使用它mt_rand()来生成一个 7 位长的随机数:

$random = mt_rand(1000000, 9999999);

这并不理想,因为您需要检查该号码是否已被其他用户使用。

于 2012-04-27T12:39:43.887 回答
0

如果您使用的是数据库。id将一列定义为uniqueand auto-incremented,然后让数据库管理您的 id。

它更安全。

阅读更多:mysql-doc

于 2012-04-27T12:45:28.193 回答
0

看看这篇文章

它解释了如何生成简短的唯一 ID,就像 youtube 一样。

实际上,文章中的函数与php 函数 base_convert非常相关,它将一个数字从一个基数转换为另一个数(但最多只能达到 36 个基数)。

于 2014-02-20T13:37:57.827 回答