【发布时间】:2017-01-28 15:35:37
【问题描述】:
背景:
我正在创建一个服务预订网站。每个订单都需要有一个唯一的订单号。我选择了 16 位,因为这是以前的软件使用的。
问题
我不确定将数据放入订单号是否有任何好处,或者它是否应该只是一个纯粹的随机字符串。
如果它只是一个随机字符串,那么它的唯一目的就是充当一个 ID。如果是这样,那为什么不直接使用增量 ID?除了混淆我们向最终用户生成的订单数量之外,我想不出一个好的理由。
如果将数据放入字符串中是个好主意,我应该包含什么样的数据?可能是订单的日期,但除此之外我不知道。
我目前正在生成一个像这样的纯随机 16 位字符串。
public function generateOrderNumber()
{
$time = time(); // Time (CET) to hash
$token = md5($time); // Hash stored in variable
return str_shuffle(substr($token, 0, 16)); // Hash shortened to 5 chars and randomised
}
但是我不确定这是否足以用于生产。
【问题讨论】:
-
为什么不使用自动增量?如果你想混淆你让它从一个随机数开始
-
我们也不知道。我们完全不知道您的生产需求/要求。另外,为什么 str_shuffle? md5 哈希值本质上始终是“随机的”。缩短它会减少键空间并增加发生冲突的机会,并且改组它并不能帮助您防止冲突。
-
有道理@Marc B,感谢您澄清这一点。我假设如果我们生成了足够多的订单,那么在使用 MD5 时就有可能出现主键匹配,尽管这种可能性非常低。
-
关于将数据放入字符串中,请记住,
meaningful code这个术语是矛盾的。 -
混淆数字的原因:隐藏公司获得的订单数量,使其更难猜测其他客户的订单号(当然这不应该是唯一的安全措施)