生成具有同时访问权限的唯一号码

问题描述

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

该应用程序不是很大,并且已经在运行。后端完全用香草php编写。

但是我一次只测试了一个用户。现在,我猜可能会有几个用户同时访问票务订单的情况,因为在公司内部订购时间很短。

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

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

但是我想知道是否有可能不使用db函数(如sql函数)来实现这一点。我猜想这在其他情况下也可能有用,在这些情况下我可能无法使用类似sql的东西。我想到了诸如“阻止访问数字/功能”之类的问题,直到第一个调用函数将其再次释放。

解决方法

如果票号不必按特定顺序排列,则可以生成随机票号:

function generate_string($input,$strength = 10) {

$input_length = strlen($input);
$random_string = '';
for ($i = 0; $i < $strength; $i++) {
    $random_character = $input[random_int(0,$input_length - 1)];
    $random_string .= $random_character;
}

return $random_string;
}

带有例如

$input = '0123456789';

甚至

$input = '0123456789ABCDEF';

获取十六进制的票号。

,

您可以使用hrtime()

<?php
// hrtime
echo hrtime(true).PHP_EOL.
    hrtime(true).PHP_EOL.
    hrtime(true).PHP_EOL.
    hrtime(true).PHP_EOL.
    hrtime(true).PHP_EOL;
    
// microtime
echo microtime(true).PHP_EOL.
    microtime(true).PHP_EOL.
    microtime(true).PHP_EOL.
    microtime(true).PHP_EOL.
    microtime(true).PHP_EOL.
    microtime(true);

结果:

25558478919927842
25558478919929611
25558478919930289
25558478919930576
25558478919930779
1597318697.2849
1597318697.2849
1597318697.2849
1597318697.2849
1597318697.2849
1597318697.2849

以上内容与几个用户将同时访问票务订单相当。如您所见,微时间是不够的。

但是您可以使用上面的最后5个数字,即27842,并且很可能是唯一的。

除此之外,您可以将用户ID放在前面,以获得更多的熵。

如果您希望连续且100%防止重复,那么您唯一的选择是使用存储在数据库中的增量ID。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...