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

时间:2016-09-20 15:54:16

标签: php mysql sql hash

背景:

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

但是我不确定这对于生产是否足够好。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

MD5仅生成a-f0-9范围内的值,这在此严格限制。你真的需要扩展它并使用整个字母表,甚至可能使用Base62,Base64的变体减去两个"烦人的"字符。

加密随机数,而不是垃圾rand()产生的,编码为5个字符的Base62值可能有效。

如果您需要人们手动阅读和编写这些值,您会想要省略0O1以及lI为了清楚起见。

请记住,在非常短的值上,您可能会遇到冲突,因此您需要针对INSERT约束测试任何UNIQUE,并在失败时重试。