随机生成固定的位数(比如8位)的数字,
作为用户注册的uid存入数据库,
每个uid不重复,
但可以是12345678,12345677。
有种方法是随机生成8位数字,
然后查询数据库有无此数据,
有则重新生成在查询,
无则写入数据库,
这样的方式比较费时。
有没有更好的方法,
比如结合别的随机值、时间戳之类的。
求解题思路或者方法,可用php实现
走同样的路,发现不同的人生
通常数据库中存储的就是时间戳,也就是当前系统时间的毫秒数,然后除以1000,获取当前时间的秒数做为uid即可,因为如要存储的是毫秒的话,它占用数据库太长,用秒数即可保证唯一不重复。如果想让生成uid不只是数字还要有字母的话,可以将秒数转成16进制即可。
用户注册的uid,在某个范围自增就可以吧。 假设用户注册的qps没有那么高,可以利用update+私有复杂数据的方法在mongodb模拟一个锁,锁保护“上次注册的用户的uid”数据,每次拿锁,加一,注册,将锁保护的uid+1,释放锁即可。
唯一,非顺序:md5(uniqid()); 顺序唯一:自增
使用时间戳,重复的几率几乎没有。
//生成0到1的随机小数 public function randomFloat($min = 0, $max = 1) { return $min + mt_rand() / mt_getrandmax() * ($max - $min); }
为什么怎么搞?不用主键自增?
uid最好还是用主键自增吧,然后php这边用mysql_insert_id()之类的函数取。这样查询操作也比较少。
mysql_insert_id()
创建一个自增列,起始值从10000000开始就行了。
很高兴为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重复的问题。
通常数据库中存储的就是时间戳,也就是当前系统时间的毫秒数,然后除以1000,获取当前时间的秒数做为uid即可,因为如要存储的是毫秒的话,它占用数据库太长,用秒数即可保证唯一不重复。如果想让生成uid不只是数字还要有字母的话,可以将秒数转成16进制即可。
用户注册的uid,在某个范围自增就可以吧。
假设用户注册的qps没有那么高,可以利用update+私有复杂数据的方法在mongodb模拟一个锁,锁保护“上次注册的用户的uid”数据,每次拿锁,加一,注册,将锁保护的uid+1,释放锁即可。
唯一,非顺序:md5(uniqid());
顺序唯一:自增
使用时间戳,重复的几率几乎没有。
为什么怎么搞?不用主键自增?
uid最好还是用主键自增吧,然后php这边用
mysql_insert_id()
之类的函数取。这样查询操作也比较少。创建一个自增列,起始值从10000000开始就行了。
很高兴为LZ解答这个问题。
首先,有什么东西是不停递增,并且不会重复的?
时间。
正如LZ猜想的那样,使用时间截转化成数字,可以产生始终递增并且不会重复的数字。
并且,这些数字还可以根据时间的推移,看大小就知道注册先后和注册时间。
这里仅仅是抛砖引玉。
LZ可以把$unix_stamp作为随机uid,如果认为秒数产生的数值不够随机的话
(比如1秒内有多人同时注册),可以在$unix_stamp后加上microtime()函数转换成数字
来使得这个数字更加随机,以避免uid重复的问题。