如果我想给每个在我的网站上注册的用户一个唯一的id。在我看来,如果我想这样做,我必须:为id创建一个随机数,检查该id是否已经存在于数据库中,如果它确实存在,那么创建另一个随机数并发送另一个查询,看看它是否存在,等等…
这可能会持续很长时间。除了有一个递增的id,还有什么合适的方法来做到这一点吗?
最好的方法是通过auto increment函数,如果你真的不想使用这样的函数,你可以使用uniqid();
基本上它会生成一个基于毫秒的唯一id,如果你在函数中加入一个唯一的前缀它会生成一个非常独特的id
echo uniqid('prefix');
这样你就不必在生成id后检查它是否已经存在。你可以确定它是唯一的。
有关更多信息,请查看此url http://php.net/uniqid!
首先,我同意这些评论。这都是开销代码,如果您使用它是为了让它看起来有趣,那么您应该重新考虑您的优先级。
但是,如果你仍然需要它;这里有一些东西:
function uid() {
mt_srand((double)microtime()*1000000);
$token = mt_rand(1, mt_getrandmax());
$uid = uniqid(md5($token), true);
if($uid != false && $uid != '' && $uid != NULL) {
$out = sha1($uid);
return $out;
} else {
return false;
}
}
基本上,它做了大量的随机数生成来为uniqueid创建一个令牌,然后就是sha。可能会产生开销,但可以确保永远不会生成双uid。
费边。
可以使用rand()函数。它将生成一个介于两者之间的随机数。
rand(0000,9999)
生成一个介于0到9999之间的数字。
检查是否已经存在:
$id = rand(0000,9999);
/* CREATE YOUR MYSQL CONNECTION */
$user_list = mysql_query("SELECT * FROM users");
while ($user = mysql_fetch_array($user_list))
{
if ($id == $user['id'])
{
echo('Already exist.');
}
else
{
/* YOUR CODE */
}
}
如果你有一串15个数字,你看到的是999万亿,考虑到地球上有近70亿人,我怀疑它能运行很长时间。
ID需要是数字吗?通过切换到字母字符,你会得到一个很多更多的熵。一个6位数的数字有1,000,000种可能,一个6个字符的字母数字字符串有2,176,782,336种可能。如果是混合大小写字母数字,那么这个数字将跳转到15625,000,000。
以下是我通常如何生成尽可能短的唯一字符串的方法:$chars = 'abcdefghijklmnopqrstuvwrxyzABCDEFGHIJKLMNOPQRSTUVWRXYZ0123456789';
mt_srand((double)microtime()*1000000);
$id = '';
do {
$id .= $chars[mt_rand(0, strlen($chars) - 1)];
} while (isIdTaken($id));
var_dump($id);
你必须创建一个批次的项目与这种风格的id,之前你会得到超过3或4个字符。
我知道现在给出这个答案有点晚了,但最简单的解决方案是生成随机数,并确保它是唯一的100%是
$uid = uniqid().date("Ymdhhis");