84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
有一个需求,要给每一条数据生成一个ID,不可重复,由于业务要求,不能用MySQL的auto increment,只能用程序生成ID。我现在想到的方案是用
$uniqid = md5(microtime());
但是我担心md5的碰撞和并发高了以后microtime的重复。
请问,有没有这样生成Uniq ID的方案什么的?
ringa_lee
string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )有这个函数的说..
前段时间也思考了很多种方案,不过由于服务器有可能是多台的原因,最终都否定了跟时间有关系的方案。最终还是选择了数据库表的auto Increment。。
最终的方案是:做一个临时表 就一个字段 id primary key auto Increment.对这个表插入空数据 直接返回唯一ID
一 程序生UID (1)常用的函数组合法有 md5 hash uniqid microtime mt_rand chr hexdec二 适合大型应用 系统每次自动生成N个唯一ID存到队列 从队列去取得三 适合大型应用 加入一定的业务规则或者服务器hash规则 + 随机ID四 自增长 单机单库
我一般用这个
md5(uniqid(rand(), true));
比如多台服务器,可以这样组成唯一串server_id + 扩展_id + mt_rand(10000,9999) + microtime(true) + 候补串这样每个串长度是固定的,如果对长度有要求或者新增加规则了,候补串就能发挥出作用来,小弟愚见,各位补充
snowflake是一个不错的方案。
可以考虑使用mysql的uuid函数,该算法保证了出现冲突的概率几乎可以忽略不计。而且很通用,有各种语言支持的库来生成。
microtime + Client信息 + Server信息
Client信息可以是客户端ip,user agent等Server信息可以使server ip等
其实就是uniqid函数加上恰当的前缀,这样惟一性是没有问题的
uniqid(rand(xx,xx))
可好?
wweqweqwe
string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )
有这个函数的说..
前段时间也思考了很多种方案,不过由于服务器有可能是多台的原因,最终都否定了跟时间有关系的方案。
最终还是选择了数据库表的auto Increment。。
最终的方案是:
做一个临时表 就一个字段 id primary key auto Increment.对这个表插入空数据 直接返回唯一ID
一 程序生UID (1)常用的函数组合法有 md5 hash uniqid microtime mt_rand chr hexdec
二 适合大型应用 系统每次自动生成N个唯一ID存到队列 从队列去取得
三 适合大型应用 加入一定的业务规则或者服务器hash规则 + 随机ID
四 自增长 单机单库
我一般用这个
比如多台服务器,可以这样组成唯一串
server_id + 扩展_id + mt_rand(10000,9999) + microtime(true) + 候补串
这样每个串长度是固定的,如果对长度有要求或者新增加规则了,候补串就能发挥出作用来,小弟愚见,各位补充
snowflake是一个不错的方案。
可以考虑使用mysql的uuid函数,该算法保证了出现冲突的概率几乎可以忽略不计。而且很通用,有各种语言支持的库来生成。
microtime + Client信息 + Server信息
Client信息可以是客户端ip,user agent等
Server信息可以使server ip等
其实就是uniqid函数加上恰当的前缀,这样惟一性是没有问题的
可好?
wweqweqwe