为了产生唯一的Id我想我必须在php中使用uniqid函数 但默认情况下,uniqid会产生13位长的HEXA号码。
4f66835b507db
我想将这个数字减少到7位数的NUMERIC数字,但我想保留单一性。可能吗 ?
4974012
此号码将用作用户ID。身份验证将通过Id和密码完成。
有人说uniqid不是唯一的!这是一个糟糕的选择吗?
答案 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)
答案 5 :(得分:0)
看看这篇文章
它解释了如何生成短的唯一ID,就像youtube一样。
实际上,文章中的函数与php function base_convert非常相关,{{3}}将数字从基数转换为另一个(但最多只能基数为36)。