随机生成固定的位数(比如8位)的数字,
作为用户注册的uid存入数据库,
每个uid不重复,
但可以是12345678,12345677。
有种方法是随机生成8位数字,
然后查询数据库有无此数据,
有则重新生成在查询,
无则写入数据库,
这样的方式比较费时。
有没有更好的方法,
比如结合别的随机值、时间戳之类的。
求解题思路或者方法,可用php实现
怪我咯2017-04-10 14:56:51
通常数据库中存储的就是时间戳,也就是当前系统时间的毫秒数,然后除以1000,获取当前时间的秒数做为uid即可,因为如要存储的是毫秒的话,它占用数据库太长,用秒数即可保证唯一不重复。如果想让生成uid不只是数字还要有字母的话,可以将秒数转成16进制即可。
天蓬老师2017-04-10 14:56:51
用户注册的uid,在某个范围自增就可以吧。
假设用户注册的qps没有那么高,可以利用update+私有复杂数据的方法在mongodb模拟一个锁,锁保护“上次注册的用户的uid”数据,每次拿锁,加一,注册,将锁保护的uid+1,释放锁即可。
PHP中文网2017-04-10 14:56:51
//生成0到1的随机小数
public function randomFloat($min = 0, $max = 1) {
return $min + mt_rand() / mt_getrandmax() * ($max - $min);
}
迷茫2017-04-10 14:56:51
很高兴为LZ解答这个问题。
首先,有什么东西是不停递增,并且不会重复的?
时间。
正如LZ猜想的那样,使用时间截转化成数字,可以产生始终递增并且不会重复的数字。
并且,这些数字还可以根据时间的推移,看大小就知道注册先后和注册时间。
这里仅仅是抛砖引玉。
$now=date("Y-m-d H:i:s");//按照 年月日,时分秒的格式,记录当前时间。
$unix_stamp=strtotime($now);
echo $unix_stamp;
/*strtotime函数预期一个包含美国英语日期格式的字符串,并尝试将其
解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数)
这里LZ大概会得到一个10位的数字。*/
LZ可以把$unix_stamp作为随机uid,如果认为秒数产生的数值不够随机的话
(比如1秒内有多人同时注册),可以在$unix_stamp后加上microtime()函数转换成数字
来使得这个数字更加随机,以避免uid重复的问题。