背景:
我正在创建一个服务预订网站。每个订单都需要一个唯一的订单号。我选择了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
}
但是我不确定这对于生产是否足够好。
答案 0 :(得分:3)
如果您需要全局唯一,例如跨越多个间隔同步的数据库,那么我将使用标准的128位GUID,它可以被压缩为16个8位字节以保持向后兼容性。 PHP有com_create_guid
来生成GUID。
答案 1 :(得分:0)
MD5仅生成a-f0-9
范围内的值,这在此严格限制。你真的需要扩展它并使用整个字母表,甚至可能使用Base62,Base64的变体减去两个"烦人的"字符。
加密随机数,而不是垃圾rand()
产生的,编码为5个字符的Base62值可能有效。
如果您需要人们手动阅读和编写这些值,您会想要省略0
,O
和1
以及l
和I
为了清楚起见。
请记住,在非常短的值上,您可能会遇到冲突,因此您需要针对INSERT
约束测试任何UNIQUE
,并在失败时重试。