为了生成唯一的 ID,我想我必须在 php.ini 中使用 uniqid 函数。
但是 uniqid 默认生成一个 13 位长的 HEXA 数字。
4f66835b507db
我想将此数字减少到 7 位长的 NUMERIC 数字,但我想保留唯一性。是否可以 ?
4974012
此号码将用作用户 ID。身份验证将使用 id 和密码完成。
有人说uniqid不是唯一的!这是一个糟糕的选择吗?
为了生成唯一的 ID,我想我必须在 php.ini 中使用 uniqid 函数。
但是 uniqid 默认生成一个 13 位长的 HEXA 数字。
4f66835b507db
我想将此数字减少到 7 位长的 NUMERIC 数字,但我想保留唯一性。是否可以 ?
4974012
此号码将用作用户 ID。身份验证将使用 id 和密码完成。
有人说uniqid不是唯一的!这是一个糟糕的选择吗?
任何“唯一”数字在生成足够多的记录后最终都会发生冲突。为了确保唯一性,您需要将生成的值存储到数据库中,并且在生成下一个值时,您需要检查是否没有冲突。
但是,在实践中,应用程序通常将 ID 生成为简单的序列 1,2,3,... 这样您就知道在用完数据类型之前不会发生冲突(UINT 通常为 32 位长,这给出了你有 40 亿个唯一 ID)。
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.
编写一个 while 循环,生成所需长度的随机字母和数字,循环直到它创建一个尚未使用的 ID。
好吧,通过将其减少到 7 个字符并且只有数字,您将“唯一性”减少了很多。
我建议使用用户 ID 的自动增量,如果它必须是 7 位数字,则从 1000000 开始。
如果你真的必须在没有自动增量的情况下生成它,你可以使用它mt_rand()
来生成一个 7 位长的随机数:
$random = mt_rand(1000000, 9999999);
这并不理想,因为您需要检查该号码是否已被其他用户使用。
看看这篇文章
它解释了如何生成简短的唯一 ID,就像 youtube 一样。
实际上,文章中的函数与php 函数 base_convert非常相关,它将一个数字从一个基数转换为另一个数(但最多只能达到 36 个基数)。