生成同时访问的唯一编号

情况:人们会在我的系统上订购门票,我想生成门票号码。

该应用程序并不是那么大,而且已经可以运行了。后端完全用 vanilla php 编写。

但我一次只对一名用户进行测试。现在我猜想多个用户有可能同时访问票证订单,因为公司内订购的时间窗口很短。

数据库 (MongoDB) 将每个事件保存为文档。每个文档都有一个字段,用于保存第一个免费票号。付款过程结束后,php 脚本检查用户购买了多少张票,然后开始生成票号(获取当前值 -> 增加 -> 将其保存到数据库 -> 等)。现在,当两个人同时执行此操作时,可能会发生这样的事情:两个人都将获得 2314 作为当前可用数字,并且随后都会增加该数字。现在有两张票号相同的票。

我考虑更改为 sql 并获取插入行的 id,因为这已经是一个唯一的数字。我也想过取当前时间+盐并对其进行哈希处理(但这样就会出现残酷的票号)。

但我想知道是否有可能在不使用 sql 之类的 db 函数的情况下实现这一目标。我想这在其他场景中也很有用,在这些场景中我可能无法使用诸如 sql 之类的东西。我想过“阻止对数字/函数的访问”之类的事情,直到第一个调用函数再次释放它。



一只斗牛犬
浏览 109回答 2
2回答

缥缈止盈

您可以使用hrtime()<?php// hrtimeecho hrtime(true).PHP_EOL.    hrtime(true).PHP_EOL.    hrtime(true).PHP_EOL.    hrtime(true).PHP_EOL.    hrtime(true).PHP_EOL;    // microtimeecho microtime(true).PHP_EOL.    microtime(true).PHP_EOL.    microtime(true).PHP_EOL.    microtime(true).PHP_EOL.    microtime(true).PHP_EOL.    microtime(true);结果:25558478919927842255584789199296112555847891993028925558478919930576255584789199307791597318697.28491597318697.28491597318697.28491597318697.28491597318697.28491597318697.2849上面相当于几个用户会同时访问机票订单。正如你所看到的,微时间是不够的。但您可以使用上面的最后 5 个数字,即 27842,并且很可能是唯一的。除此之外,您可以在前面放置一个用户 ID 以获得更多熵。如果您想要连续且 100% 防止重复,那么您唯一的选择是使用存储在数据库中的增量 ID。

倚天杖

如果票号不必按特定顺序排列,您可以生成随机票号:function generate_string($input, $strength = 10) {$input_length = strlen($input);$random_string = '';for ($i = 0; $i < $strength; $i++) {&nbsp; &nbsp; $random_character = $input[random_int(0, $input_length - 1)];&nbsp; &nbsp; $random_string .= $random_character;}return $random_string;}与例如$input = '0123456789';甚至$input = '0123456789ABCDEF';对于十六进制票号。
打开App,查看更多内容
随时随地看视频慕课网APP