为了产生一个唯一的Id,我想我必须在php中使用uniqid函数。
但默认情况下,uniqid 会生成一个 13 位长的 HEXA 号码。
4f66835b507db
我想将此数字减少到 7 位数字长的数字,但我想保留单性。可能吗?
4974012
此号码将用作用户 ID。身份验证将使用 Id 和密码完成。
有人说uniqid不是独一无二的!这是一个糟糕的选择吗?
任何"唯一"数字在生成足够的记录后最终都会发生冲突。为了确保唯一性,您需要将生成的值存储到数据库中,并且在生成下一个数据库时,您需要检查是否存在冲突。
但是,在实践中,应用程序通常以简单的序列 1,2,3 的形式生成 ID,...这样你就知道在数据类型用完之前不会发生冲突(UINT 通常长 32 位,这给了你 40 亿个唯一 ID(。
Uniqid不能保证是唯一的,即使是完整的长度。
此外,uniqid 旨在仅在本地独一无二。这意味着,如果您在两个或多个服务器上同时创建用户,即使您使用全长 uniqid,您最终也可能为两个不同的用户提供一个 ID。
我的建议:
-
如果您真的在寻找全局唯一标识符(即您的应用程序在具有单独数据库的多个服务器上运行(,则应使用 UUID。这些甚至比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);
这并不理想,因为您需要检查该号码是否已被其他用户使用。
看看这篇文章
- 使用 PHP 创建短 ID - 如 Youtube 或 TinyURL
它解释了如何生成短的唯一ID,就像youtube一样。
实际上,本文中的函数与 php 函数base_convert非常相关,后者将一个数字从一个基数转换为另一个基数(但最多只能以 36 为基数(。
如果您使用的是数据库。将id
列定义为 unique
和 auto-incremented
,然后让数据库管理您的 ID。
它更安全。
阅读更多 : mysql-doc