为了账号安全,请及时绑定邮箱和手机立即绑定

生成同时访问的唯一编号

生成同时访问的唯一编号

PHP
一只斗牛犬 2023-10-01 15:56:44
情况:人们会在我的系统上订购门票,我想生成门票号码。该应用程序并不是那么大,而且已经可以运行了。后端完全用 vanilla php 编写。但我一次只对一名用户进行测试。现在我猜想多个用户有可能同时访问票证订单,因为公司内订购的时间窗口很短。数据库 (MongoDB) 将每个事件保存为文档。每个文档都有一个字段,用于保存第一个免费票号。付款过程结束后,php 脚本检查用户购买了多少张票,然后开始生成票号(获取当前值 -> 增加 -> 将其保存到数据库 -> 等)。现在,当两个人同时执行此操作时,可能会发生这样的事情:两个人都将获得 2314 作为当前可用数字,并且随后都会增加该数字。现在有两张票号相同的票。我考虑更改为 sql 并获取插入行的 id,因为这已经是一个唯一的数字。我也想过取当前时间+盐并对其进行哈希处理(但这样就会出现残酷的票号)。但我想知道是否有可能在不使用 sql 之类的 db 函数的情况下实现这一目标。我想这在其他场景中也很有用,在这些场景中我可能无法使用诸如 sql 之类的东西。我想过“阻止对数字/函数的访问”之类的事情,直到第一个调用函数再次释放它。
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

您可以使用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。


查看完整回答
反对 回复 2023-10-01
?
倚天杖

TA贡献1828条经验 获得超3个赞

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


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';

对于十六进制票号。


查看完整回答
反对 回复 2023-10-01
  • 2 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信