Home  >  Q&A  >  body text

uniqid - php生成 uniq id的方案

有一个需求,要给每一条数据生成一个ID,不可重复,由于业务要求,不能用MySQL的auto increment,只能用程序生成ID。
我现在想到的方案是用

$uniqid = md5(microtime());

但是我担心md5的碰撞和并发高了以后microtime的重复。

请问,有没有这样生成Uniq ID的方案什么的?

ringa_leeringa_lee2749 days ago1345

reply all(10)I'll reply

  • ringa_lee

    ringa_lee2017-04-10 13:13:49

    string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )
    有这个函数的说..

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 13:13:49

    前段时间也思考了很多种方案,不过由于服务器有可能是多台的原因,最终都否定了跟时间有关系的方案。
    最终还是选择了数据库表的auto Increment。。

    最终的方案是:
    做一个临时表 就一个字段 id primary key auto Increment.对这个表插入空数据 直接返回唯一ID

    reply
    0
  • 迷茫

    迷茫2017-04-10 13:13:49

    一 程序生UID (1)常用的函数组合法有 md5 hash uniqid microtime mt_rand chr hexdec
    二 适合大型应用 系统每次自动生成N个唯一ID存到队列 从队列去取得
    三 适合大型应用 加入一定的业务规则或者服务器hash规则 + 随机ID
    四 自增长 单机单库

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 13:13:49

    我一般用这个

    md5(uniqid(rand(), true));

    reply
    0
  • 黄舟

    黄舟2017-04-10 13:13:49

    比如多台服务器,可以这样组成唯一串
    server_id + 扩展_id + mt_rand(10000,9999) + microtime(true) + 候补串
    这样每个串长度是固定的,如果对长度有要求或者新增加规则了,候补串就能发挥出作用来,小弟愚见,各位补充

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 13:13:49

    1. 数据库自增字段拿来hash。可提前证明没有冲突
    2. 外部服务提供uniq id。比如snowflake http://engineering.twitter.com/2010/0...
    3. 使用很多NoSQL的自增方案。比如mongodb的

    snowflake是一个不错的方案。

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 13:13:49

    可以考虑使用mysql的uuid函数,该算法保证了出现冲突的概率几乎可以忽略不计。而且很通用,有各种语言支持的库来生成。

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 13:13:49

    microtime + Client信息 + Server信息

    Client信息可以是客户端ip,user agent等
    Server信息可以使server ip等

    其实就是uniqid函数加上恰当的前缀,这样惟一性是没有问题的

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 13:13:49

    uniqid(rand(xx,xx))

    可好?

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 13:13:49

    <?php>

    wweqweqwe

    reply
    0
  • Cancelreply