如何用PHP生成正确的订单号


How to generate a proper order number with PHP?

Background:

我正在创建一个服务预订网站。每个订单需要有一个唯一的订单号。我选择了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
}

然而,我不确定这是否足以用于生产。

如果您需要全局唯一,例如跨多个数据库同步,那么我将使用标准的128位GUID,它可以压缩为16个8位字节以保持向后兼容性。PHP有com_create_guid来生成guid

MD5只产生a-f0-9范围内的值,这在这里受到了严重的限制。你真的需要扩展它并使用整个字母表,甚至可能是Base62, Base64的变体减去两个"讨厌的"字符。

一个加密随机数,而不是rand()产生的垃圾,编码为5个字符的Base62值可以工作

如果您需要人们能够手动读取和写入这些值,您将需要省略0, O1以及lI,以便清晰。

请记住,在非常短的值上,您可能会遇到冲突,因此您需要根据UNIQUE约束测试任何INSERT,如果失败则重试。