但是默认情况下,uniqid生成一个13位长的十六进制数字。
4f66835b507db
我希望将这个数字缩短为7位数,但是我想保持其唯一性。这是否可能?
4974012
这个数字将作为用户ID使用。认证将使用此ID和密码进行。
有些人说uniqid不是唯一的!这是一个糟糕的选择吗?
4f66835b507db
4974012
这个数字将作为用户ID使用。认证将使用此ID和密码进行。
有些人说uniqid不是唯一的!这是一个糟糕的选择吗?
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.
好的,通过将其缩短为7个数字并仅使用数字,您大大降低了“唯一性”。
我建议使用用户ID的自动增量,并从1000000开始,如果必须为7位数字。
如果您真的必须在没有自动增量的情况下生成它,可以使用mt_rand()
生成一个7位数字的随机数:
$random = mt_rand(1000000, 9999999);
这并不理想,因为您需要检查该数字是否已被其他用户使用。
str_pad(mt_rand(0, 9999999), 7, 0);
代替。这样可以生成更多的随机数。 - Tehnix0000001
不是我个人认为的好用户ID,在某些情况下例如(int)$userId
中将被截断为1
。 - MrCode