如何使用PHP生成正确的订单号?
背景: 我正在创建一个服务预订网站。每个订单都需要有一个唯一的订单号。我选择了16位数字,因为这是以前的软件使用的 问题 我不确定将数据放入订单号是否有任何好处,或者它是否应该只是一个纯粹的随机字符串 如果它只是一个随机字符串,那么它的唯一用途就是充当一个ID。如果是这样,那么为什么不使用一个增量ID呢?除此之外,为了混淆我们向最终用户生成的订单数量,我想不出一个好的理由 如果将数据放入字符串是一个好主意,那么我应该包含什么样的数据?可能是订单的日期,但除此之外我不知道 我目前正在生成一个纯随机的16位字符串,如下所示如何使用PHP生成正确的订单号?,php,mysql,sql,hash,Php,Mysql,Sql,Hash,背景: 我正在创建一个服务预订网站。每个订单都需要有一个唯一的订单号。我选择了16位数字,因为这是以前的软件使用的 问题 我不确定将数据放入订单号是否有任何好处,或者它是否应该只是一个纯粹的随机字符串 如果它只是一个随机字符串,那么它的唯一用途就是充当一个ID。如果是这样,那么为什么不使用一个增量ID呢?除此之外,为了混淆我们向最终用户生成的订单数量,我想不出一个好的理由 如果将数据放入字符串是一个好主意,那么我应该包含什么样的数据?可能是订单的日期,但除此之外我不知道 我目前正在生成一个纯随机
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
}
但是,我不确定这是否足以用于生产。MD5只产生
a-f0-9
范围内的值,这在这里受到了严重限制。你真的需要扩展它并使用整个字母表,甚至可能是Base62,Base64的一个变体减去两个“讨厌的”字符
一个加密的随机数,而不是垃圾rand()
产生的随机数,编码为5个字符的Base62值可以工作
如果您需要人们能够手动读取和写入这些值,为了清晰起见,您需要省略0
、O
和1
和l
和I
请记住,对于非常短的值,您可能会遇到冲突,因此您需要根据
UNIQUE
约束测试您执行的任何INSERT
,如果失败,请重试。如果您需要全局唯一性,例如跨多个间隔同步的数据库,然后我会使用标准的128位GUID,它可以压缩为16个8位字节,以保持向后兼容性。PHP有com\u create\u guid
来生成guid。为什么不使用自动增量呢?如果你想混淆,你可以从一个随机数开始,我们也不知道。我们完全不知道您的生产需求/要求。另外,为什么要拖沓?md5散列值本质上总是“随机”的。缩短它会减少键空间并增加碰撞的机会,而洗牌并不能帮助您防止碰撞。有意义@Marc B,感谢您的澄清。我假设,如果我们生成了足够多的订单,那么在使用MD5时,主键匹配的可能性很低。关于将数据放入字符串,请记住,有意义的代码
,这是一个矛盾的说法。混淆数字的原因:隐藏公司收到的订单数量,更难猜测其他客户的订单号(当然这不应该是唯一的安全措施)是base64中的那些“恼人”字符,有时是填充字符(=
)?是的,恼人的是=
填充字符,还有+
和/
,它们会弄乱URL中的值。这就是为什么Base62是一个流行的替代品。字节可以是8位以外的任何东西吗?(我认为4位构成一个半字节,16位构成一个字,因此8位总是一个字节。所以你可以说,16字节
?)现在是的,但历史上并不总是这样。我是个老古董,喜欢打卡和分时度假。