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

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

让PHP再次伟大
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 51

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

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

小聪明应该怎么做呢?

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

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

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

没问题不就行吗。。

1个月前 评论
shunjian_1 (作者) 1个月前
勇敢的心 (楼主) 1个月前
shunjian_1 (作者) 1个月前
勇敢的心 (楼主) 1个月前
mowangjuanzi

确实不合适。这玩意,我其实喜欢用 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个月前
荒街! (作者) 1个月前
laravelphp_game 1个月前

没太大问题,字段加个唯一索引,插到数据库之前做个检查,如果唯一建冲突就加个 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 1个月前

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

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

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

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

1个月前 评论

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