怎样生成数据库中不重复的固定位数的数字?
随机生成固定的位数(比如8位)的数字,
作为用户注册的uid存入数据库,
每个uid不重复,
但可以是12345678,12345677。
有种方法是随机生成8位数字,
然后查询数据库有无此数据,
有则重新生成在查询,
无则写入数据库,
这样的方式比较费时。
有没有更好的方法,
比如结合别的随机值、时间戳之类的。
求解题思路或者方法,可用php实现
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
通常数据库中存储的就是时间戳,也就是当前系统时间的毫秒数,然后除以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重复的问题。