讨论数量:
目前主要还是基于时间戳实现比较多
// 年月日时分秒+随机数
date('YmdHis', time()) . sprintf('%05d', rand(0, 99999));
// 当前时间戳+随机+随机数
intval(microtime(true) * 10000) . (getmypid() % 10) . sprintf('%04d', rand(0, 9999))
网上找的,然后自己改了,订单号这个,好像是测了并发1w的时候会有10个以下的重复,但是我这边业务完全没到这个级别,基本就没问题了。
if (!function_exists('createGuid')) {
/**
* 生成 guid.
*
* @return string
*/
function createGuid()
{
$char = strtoupper(sha1(uniqid(mt_rand(), true)));
$hyphen = chr(45);
return substr($char, 0, 8).$hyphen
.substr($char, 8, 4).$hyphen
.substr($char, 12, 4).$hyphen
.substr($char, 16, 4).$hyphen
.substr($char, 20, 16);
}
}
if (!function_exists('createOrderNumber')) {
/**
* 创建订单号.
*
* @return string
*/
function createOrderNumber()
{
return date('Ymd').substr(time(), -5)
.substr(microtime(), 3, 5).sprintf('%02d', mt_rand(0, 99));
}
}
sku编号显然不适合用雪花这类方式生成,一般是带有商品信息含义根据业务的规则来;订单号也是如此一般带有时间信息和类型标识;此外这类业务编号还会有长度限制,比如要打印条码的就不能太长,否则打印都会成问题。
格式:年月日
时分秒
随机数8位
请求 IP 后三位(补零)
用户ID后四位(补零)
随机数3位
例如:20220223141830 54789515 123 1245 351
这样重复的概率就很小了
推荐文章: