今天看到一个大聪明用md5做订单号!

今天看到一个大聪明用md5做订单号!:laughing: :laughing: :laughing:

让PHP再次伟大
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 51

只要订单号不重复 用md5也不是不能用

1年前 评论
RT 1年前
忆往昔弹指间 1年前
勇敢的心 (楼主) 1年前
qufo 1年前
勇敢的心 (楼主) 1年前
seebyyu 1年前
冯小胖同学 (作者) 1年前
qufo 11个月前

小聪明应该怎么做呢?

1年前 评论
aba66 10个月前
arukas 1年前
勇敢的心 (楼主) 1年前
PHPer技术栈 1年前

只要订单号不重复 用md5也不是不能用

1年前 评论
RT 1年前
忆往昔弹指间 1年前
勇敢的心 (楼主) 1年前
qufo 1年前
勇敢的心 (楼主) 1年前
seebyyu 1年前
冯小胖同学 (作者) 1年前
qufo 11个月前

没问题不就行吗。。

1年前 评论
shunjian_1 (作者) 1年前
勇敢的心 (楼主) 1年前
shunjian_1 (作者) 1年前
勇敢的心 (楼主) 1年前

确实不合适。这玩意,我其实喜欢用 mongodb 的 _id 生成规则来实现订单号的生成。

1年前 评论

应该还好吧,会有什么问题吗?

md5(sprintf('%s%s', date('YmdHis'), str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT)));

和uuid_create() 生成的不是差不多的意思

1年前 评论
勇敢的心 (楼主) 1年前
勇敢的心 (楼主) 1年前
liaosp (作者) 1年前
ShiKi

使用MD5作为订单号并不是一个好的做法。MD5是一个散列函数,它被设计用于计算数据的散列值,并用于数据完整性校验等目的。将MD5作为订单号不仅容易导致不同订单产生相同的散列值(冲突),还容易被攻击者用暴力破解攻击破解出原始数据,从而影响订单的安全性。更好的做法是使用能够保证唯一性和随机性的订单号。

1年前 评论

分享一下我的订单号生成规则,22 位,2304180233303966728324

private function generateOrderNo(int $datacenter = -1, int $workerid = -1)
{
    $order_no = date('ymdHis');

    // 取毫秒
    $millisecond = substr(microtime(), 2, 3);

    $datacenter = $datacenter > 31 || $datacenter < 0 ? mt_rand(0, 31) : $datacenter;
    $workerid = $workerid > 31 || $workerid < 0 ? mt_rand(0, 31) : $workerid;

    $workerLength = 5; // $datacenter 和 $workerid 占用的位数
    $workerLeftMoveLength = 12; // 随机位 12 位 即 4095
    $datacenterLeftMoveLength = $workerLeftMoveLength + $workerLength; // 17 $workerid 5 位 即 31
    $timestampLeftMoveLength = $datacenterLeftMoveLength + $workerLength; // 22

    // 毫秒时间戳 10 位 0 - 1023 (最高位可能是0, 生成后高位补0)
    $ext = (string) (((intval($millisecond)) << $timestampLeftMoveLength)
        | ($datacenter << $datacenterLeftMoveLength)
        | ($workerid << $workerLeftMoveLength)
        | (mt_rand(0, 4095))); // 随机位

    // 前置补0 10位
    $order_no .= str_pad($ext, 10, '0', STR_PAD_LEFT);

    return $order_no;
}
1年前 评论
cevin 1年前
勇敢的心 (楼主) 1年前
荒街! (作者) 1年前
liushoukun 1年前
荒街! (作者) 11个月前
laravelphp_game 11个月前

没太大问题,字段加个唯一索引,插到数据库之前做个检查,如果唯一建冲突就加个 salt,再 md5 一遍

1年前 评论

密码采用MD5常见,订单号还没见过这用的。

1年前 评论

订单号一般并不采用 md5 , 哪怕顺序号都不用 md5 因为 md5 的订单号没意义没价值。但并不表示不能用。 另外, md5 的确是会撞号。但md5 足够稀疏了,撞的机会并不大。很可能从系统运行到系统被抛弃一次撞号都遇不到。

1年前 评论

不影响使用

1年前 评论
勇敢的心 (楼主) 1年前
周小云 1年前

定式思维

1年前 评论
勇敢的心 (楼主) 1年前
勇敢的心 (楼主) 1年前
Junwind

只要能保证唯一就行,但是一般直接用 md5 ,会导致这个 订单号,没法直接知道含义,一般会采取字段拼接,比如我们项目中是这样的:

if ($gift) {
    $oid = $type . '_' . date('Ymd_His_') . uniqid() . '&' . $gift;
        } else {
    $oid = $type . '_' . date('Ymd_His_') . uniqid().'_'.mt_rand(1000, 9999);
        }
1年前 评论

问题点不应该在撞库吧

1年前 评论

有没有可能是刚毕业,只想着订单号唯一?

1年前 评论
qufo 11个月前

我都是时间 + 随机数 4-8 位左右,再加上 用户 id(左右补零保证长度)

这样除非用户自己同一秒之内并发, 并且生成的随机数还一样,否则肯定不会重复

11个月前 评论
勇敢的心 (楼主) 11个月前
qufo 11个月前
Wsmallnews (作者) 11个月前

虽然问题不大,但是不合适吧

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!