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

时间:2012-04-27 12:33:10

标签: php

为了产生唯一的Id我想我必须在php中使用uniqid函数 但默认情况下,uniqid会产生13位长的HEXA号码。

4f66835b507db

我想将这个数字减少到7位数的NUMERIC数字,但我想保留单一性。可能吗 ?

4974012  

此号码将用作用户ID。身份验证将通过Id和密码完成。

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

6 个答案:

答案 0 :(得分:5)

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

然而,在实践中,应用程序通常会生成ID作为简单的序列1,2,3,...这样你知道在用完数据类型之前你不会发生冲突(UINT通常是32位长,它给你40亿个独特的ID。

答案 1 :(得分: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.

答案 2 :(得分:1)

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

答案 3 :(得分:0)

好吧,通过将它减少到7个字符并且只有数字,你可以减少很多'唯一性'。

我建议使用用户ID的自动增量,如果长度必须为7位,则从1000000开始。

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

$random = mt_rand(1000000, 9999999);

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

答案 4 :(得分:0)

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

它更安全。

了解详情:mysql-doc

答案 5 :(得分:0)

看看这篇文章

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

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