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
, O
和1
以及l
和I
,以便清晰。
请记住,在非常短的值上,您可能会遇到冲突,因此您需要根据UNIQUE
约束测试任何INSERT
,如果失败则重试。