Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP生成正确的订单号?_Php_Mysql_Sql_Hash - Fatal编程技术网

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

如何使用PHP生成正确的订单号?,php,mysql,sql,hash,Php,Mysql,Sql,Hash,背景: 我正在创建一个服务预订网站。每个订单都需要有一个唯一的订单号。我选择了16位数字,因为这是以前的软件使用的 问题 我不确定将数据放入订单号是否有任何好处,或者它是否应该只是一个纯粹的随机字符串 如果它只是一个随机字符串,那么它的唯一用途就是充当一个ID。如果是这样,那么为什么不使用一个增量ID呢?除此之外,为了混淆我们向最终用户生成的订单数量,我想不出一个好的理由 如果将数据放入字符串是一个好主意,那么我应该包含什么样的数据?可能是订单的日期,但除此之外我不知道 我目前正在生成一个纯随机

背景:

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

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

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字节
?)现在是的,但历史上并不总是这样。我是个老古董,喜欢打卡和分时度假。