如何在 php 中生成一个短的唯一 ID


How to produce a short unique id in php?

为了产生一个唯一的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列定义为 uniqueauto-incremented ,然后让数据库管理您的 ID。

它更安全。

阅读更多 : mysql-doc