问答 / 6 / 9 / 创建于 3年前
:joy: 算法而已你可以根据自己需要写代码啊 你可以看下京东啥的 订单号其实还是纯数字 只不过不是YmdHis形式而已
目前主要还是基于时间戳实现比较多
// 年月日时分秒+随机数 date('YmdHis', time()) . sprintf('%05d', rand(0, 99999)); // 当前时间戳+随机+随机数 intval(microtime(true) * 10000) . (getmypid() % 10) . sprintf('%04d', rand(0, 9999))
gitee.com/modstart/ModStartCMS/blo...
时间戳+用户唯一的身份标记如ID+随机数
网上找的,然后自己改了,订单号这个,好像是测了并发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)); } }
时间戳+用户id(必须唯一)+随机数字
sku编号显然不适合用雪花这类方式生成,一般是带有商品信息含义根据业务的规则来;订单号也是如此一般带有时间信息和类型标识;此外这类业务编号还会有长度限制,比如要打印条码的就不能太长,否则打印都会成问题。
雪花算法长度还好,而且也是根据时间戳生成的,可以做订单号。sku确实,但sku本身就具有唯一性,根据业务生成就是唯一的,也不需要什么算法生成。
格式:年月日 时分秒 随机数8位 请求 IP 后三位(补零) 用户ID后四位(补零) 随机数3位
年月日
时分秒
随机数8位
请求 IP 后三位(补零)
用户ID后四位(补零)
随机数3位
例如:20220223141830 54789515 123 1245 351
这样重复的概率就很小了
毫秒时间戳加用户id 不够补0
我要举报该,理由是:
:joy: 算法而已你可以根据自己需要写代码啊 你可以看下京东啥的 订单号其实还是纯数字 只不过不是YmdHis形式而已
目前主要还是基于时间戳实现比较多
gitee.com/modstart/ModStartCMS/blo...
时间戳+用户唯一的身份标记如ID+随机数
网上找的,然后自己改了,订单号这个,好像是测了并发1w的时候会有10个以下的重复,但是我这边业务完全没到这个级别,基本就没问题了。
时间戳+用户id(必须唯一)+随机数字
sku编号显然不适合用雪花这类方式生成,一般是带有商品信息含义根据业务的规则来;订单号也是如此一般带有时间信息和类型标识;此外这类业务编号还会有长度限制,比如要打印条码的就不能太长,否则打印都会成问题。
格式:
年月日
时分秒
随机数8位
请求 IP 后三位(补零)
用户ID后四位(补零)
随机数3位
例如:20220223141830 54789515 123 1245 351
这样重复的概率就很小了
毫秒时间戳加用户id 不够补0