wc order_key是否始终唯一?
对/wp-json/wc/v3/orders的API调用导致-〉{..“id”:123,...,“order_key”:“wc_order_ru4mFC4nNfDAE”,...}。
下面的代码显示wc_order类中的set_order_key函数。他们使用子字符串,但我不能找出$value
的来源。
public function set_order_key( $value ) {
$this->set_prop( 'order_key', substr( $value, 0, 22 ) );
}
我想使用order_key来同步一个远程电报机器人的数据库,它处理订阅表。
2条答案
按热度按时间7gcisfzg1#
简单地说:NO,它不是真的随机。
解释深入到WooCommerce函数并调用如何生成订单,但最终取决于加密安全的伪随机PHP函数-random_int()。
在WooCommerce插件中进行简单的搜索和跟踪(版本:6.7.0)显示了以下调用堆栈:
由于最终函数是伪随机的,而不是真正随机的(这并不总是可能的),因此它仅提供非常低的重复概率,但这种可能性从未被消除。
此函数是否满足您的随机性要求取决于您的预期用例。但是WooCommerce获取子字符串的方法可能会破坏你的交易。结果置换的“随机性”受到set_order_key()〉substr(len=22)的限制,最大结果计数置换达到wp_generate_password() charset ^ 22。最终,这个数字仍然是有限的,而不是理论上的无限。
对于您的用例,由于您正在开发与其他平台的集成,您可以接管您端的权限,并在您的数据库(可能在另一个表上)上生成新的订阅ID,将您的ID反馈到woo-commerce并通过update_post_meta()存储。在这种情况下,您将摆脱上述排列限制,并拥有自己的故事。
3qpi33ja2#
在实践中,是,您可以依赖它是唯一的,特别是对于订单。请记住,这些随机字符串不是以加密方式使用的。并且创建订单的最大可能速率不足以达到有意义的冲突概率。
订单键是在处理保存订单的类中生成的。它是在每次您没有将订单键作为参数传递时创建的(我猜这是用户下订单时的默认行为)。
substr
只是对自定义ID的大小设置上限。22是绰绰有余,以避免碰撞。WooCommerce本身只使用13个字符的长顺序键。但有62个可能的字符。这产生62 ^ 13种可能性,或假设你的商店惊人地达到了10亿订单。如果它是完全随机分布的,那么遇到一次碰撞的机会只有0.0002499%。一个更合理的数字,比如1万个订单,给你的机会是0.0000000000022%。您可以验证这些计算here(使用100000000、62和13作为参数)。
与最近生成的值冲突的机会甚至比这更低。该价值可能是在许多年前产生的(假设订单创建的实际速度)。