求 16 位纯数字订单号产生算法

2020-12-26 16:35:25 +08:00
 Aluhao
最近业务方要求订单号不能大于 16 位,以前写的 18 位算法不能用了,改成 16 位重复的概率太高了,问问大家有什么好的算法分享!

现在用的 18 位:

<?php declare(strict_types=1);
date_default_timezone_set('Etc/GMT-8');
$time = microtime(true);
function order()
{
$ids = 0;
$aes = substr(microtime(), 2, 6);
$pid = $aes . getmypid() . mt_rand(0, 999999);
for($in = 0; $in < 18; $in++) {
$ids += (int) (substr($pid, $in, 1));
}
return time() . $aes . str_pad(strval($ids), 2, '0', STR_PAD_LEFT);
}

$arr = array();
for($i = 0; $i < 1000000; $i++) {
$arr[] = order();
}
$arrs = array_count_values($arr);
echo 'COUNT ' . count($arrs);
echo '<br>';
echo 'RAND ' . array_rand($arrs);
echo '<br>';
arsort($arrs);
$as = [];
foreach($arrs as $ids => $aos) {
if ($aos > 1) {
$as[] = $ids;
echo $ids . ' - ' . $aos . '<br>';
}
}
echo 'COUNT ' . count($as);
echo '<br>';
echo 'Time ' . number_format((microtime(true) - $time), 3);
6760 次点击
所在节点    PHP
43 条回复
wangritian
2020-12-28 09:29:13 +08:00
1.雪花算法:毫秒时间戳+集群号+机器号+进程号+自增序号
这里最关键的是进程常驻,需要 swoole/workerman 插件
2.额外写一个单实例部署的 id 生成器,加锁单线程运行,性能没有 1 好
nano91
2020-12-28 10:18:32 +08:00
16 位 MD5 ?拿老 18 位订单号做一次转换
afewok
2020-12-28 13:09:11 +08:00
但凡深入调研下业界和 github,都不会问出这个问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739204

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX