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

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 51

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

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

小聪明应该怎么做呢?

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

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

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

没问题不就行吗。。

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

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

2年前 评论

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

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

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

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

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

2年前 评论

分享一下我的订单号生成规则,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;
}
2年前 评论
cevin 2年前
勇敢的心 (楼主) 2年前
荒街! (作者) 2年前
shook 2年前
荒街! (作者) 2年前

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

2年前 评论

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

2年前 评论

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

2年前 评论

不影响使用

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

定式思维

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

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

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

问题点不应该在撞库吧

2年前 评论

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

2年前 评论
qufo 2年前

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

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

2年前 评论
勇敢的心 (楼主) 2年前
qufo 2年前
Wsmallnews (作者) 2年前

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

2年前 评论