PHP生成唯一序列ID

发布于 2019-09-10  4216 次阅读


天被商城里订单生成唯一序列的算法狠狠的坑了一次,留点教训吧,原因是后台代码在生成唯一序列的时候使用的md5(time()),开始倒没出什么问题,后来商城搞活动了,大家下单都比较集中,高并发的时候就有点顶不住了,频繁出现主健冲突的错误,查了一天,发现同时下的订单生成的ID容易出现相同情况。后来紧急改了一下算法使用md5(uniqid(rand(),1)),今天看了一下数据貌似问题解决了。

在PHP函数里有这么一个

    uniqid(prefix,more_entropy)

uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。

不加前缀【prefix】

//不加前缀使用的时候,生成长度13位的字符串
echo uniqid(); //5d773b86dc098
echo uniqid(""); //5d773b86dc09e

使用前缀【prefix】

//使用前缀参数后生成的前缀接13位长度字符串
echo uniqid("UNIQ_"); //UNIQ_5d773ce1da4a9

随机前缀【prefix】

//利用随机生成的前缀进一步创建唯一的ID
echo uniqid(rand()); //19650867825d773e4e0060b

增加返回值末尾的更多的熵【more_entropy】

//利用第二个参数more_entropy,返回更细的ID串
echo uniqid("",1); //5d773f033b3b32.59704431

再进一步通过哈希处理就完美一些了

//取得生成唯一ID的哈希值
echo md5(uniqid(rand(),1)); //674e942b41fb79a9427dcff65e89e32e


不恋尘世浮华,不写红尘纷扰,不叹世道苍凉,不惹情思哀怨。闲看花开,静待花落,冷暖自知,干净如始。