永远不要重复整数PHP

时间:2016-05-06 16:11:26

标签: php integer unique

我正在集成第三方Web服务,每次调用都需要一个唯一的整数,一旦消耗掉整数,它就不再接受该整数。它将是一个实时集成,即,可以从网站上的多个用户多次调用该Web服务,这意味着如果多个用户调用该Web服务,也可以同时进行调用。

现在我尝试使用PHP的uniqid()方法为每个事务生成一个唯一的id,但因为它不能保证唯一的整数。

此外,我尝试了UNIX的Epoch秒作为必需的整数,它完美地工作但我知道它不适用于同时调用。

我不需要随机数字,它可以是任何永远不会重复的数字。请提供可能的解决方案。

4 个答案:

答案 0 :(得分:3)

大量的解决方案:

  • 跟踪整数(平面文件,带整数键的数据库,自动增量)
  • 防止呼叫同时发生(使用锁,信号量等)
  • 使用队列进行通话

答案 1 :(得分:2)

使用自动递增主键创建数据库表并使用该数字。为每次调用第三方服务插入一行。

更新

根据你在另一个答案中的评论,我建议使用一个队列,以便重新尝试失败:

  

对网络服务的呼吁涉及发送数千美元。如果通话失败,那将是一个非常严重的问题......

您的队列既可以在简单的数据库表中实现,也可以使用上面提到的主键,也可以使用完整的队列服务。

答案 2 :(得分:2)

正如你所提到的那样,你已经尝试了uniqid(),它没有直接产生一个整数,我认为你需要的可以是一个字符串,你只希望它是唯一的。

这就是UUID的用途,你可以使用像this这样的库或像this这样的简单方法在PHP中生成它们。

啊UUID实际上是一个128位整数,如果需要,你可以稍微努力将它转换为十进制。

答案 3 :(得分:0)

使用带时间和uniqid的计数器。

 $_SESSION['counter'] += 1;    
 $unique = time() . $_SESSION['counter'] . str_shuffle(rand(100,10000));

如果是32位,那么

$ uniqMax = pow(2,32);

保存在数据库中并在唯一代码批准之前检查它是否存在

选项2:使用创建id的单独数据库并根据请求提供它,而不是插入带有uniqid的行