昨 天被商城里订单生成唯一序列的算法狠狠的坑了一次,留点教训吧,原因是后台代码在生成唯一序列的时候使用的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
Comments | NOTHING