繁体   English   中英

如何生成特定格式的唯一随机数并检查是否未使用它?

[英]How to generate a unique random number in a specific format and check that it is not used?

我需要生成格式为105-#####的随机数,并且需要在将其保存到数据库以确保它不存在之前,对照已创建的数字检查此生成的数字。

这是我自己生成数字的代码:

$digits = 5;
$second_num = str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);
$order_gen = "105-".$second_num;

现在,我有了这个$ order_gen编号,最好的方法是循环遍历order_number数据库表中已有的内容以确保没有重复项? 我当时在考虑使用while循环,但不确定如何应用它。

对于您的算法,没有什么更好的方法了,除了查询数据库以生成的每个ID,直到找到一个未被使用的ID。

将整个内容包装在do/while语句中,并定义一个通过该随机ID查询数据库的方法,如果记录存在,则返回true,否则返回false:

do {
  $digits = 5;
  $second_num = str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);
  $order_gen = "105-".$second_num;
} while (record_exists($order_gen);

或者,随机生成一次,然后递增直到找到未取的数字:

$digits = 5;
$second_num = str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);
$order_gen = "105-".$second_num;

while (record_exists($order_gen) {
  $second_num += 1
  $second_num = str_pad($second_num, '0', STR_PAD_LEFT);
  $order_gen = "105-".$second_num;
}

我可以想到3种选择:

  1. 生成一个id并查询以查看是否使用了它。 如果使用,请生成另一个并重复直到找到一个未使用的。 这可能是最慢的。

  2. 有一个包含所有可能ID的表。 从该表中选择一个随机行,使用该ID并将其删除,以免再次使用。 但是,这需要一个仅用于保存这些ID的表。 根据您的需要,这可能无法实现。

  3. 在PHP中,按ID查询所有现有ID。 遍历结果并制作所有ID的数组。 从那里您可以生成(如果存在于数组中),如#1那样再次生成,或者将所有可能的id组成一个数组, array_diff($allIDS, $usedIDs)查找未使用的数组,array_rand获取一个随机数组。 此选项在php中使用更多内存,必须查询出所有现有ID。

如果同时发生两个请求,则这3种方法都可能会遇到竞争条件,其中一个ID可能重复。 #2可能最容易防止比赛条件。 在删除查询上,检查受影响的行数(如果使用PDO,则为PDOStatement :: rowCount),如果为0,则在使用它之前先假定有人得到它,然后再获得另一个ID。

这可以做的工作

$rand = mt_rand(000123,999999); //prefix between 000123 to 999999
$id = "105".$rand;

$error = true;
while($error){
 $query = "SELECT id FROM table WHERE id = '$id'";
 $result = mysqli_query($conn,$query);
 $count = mysqli_num_rows($result);
  if($count!=0){
   $error = true;
   $rand = mt_rand(000123,999999);
   $id = "105".$rand;    
  }else{
   $error = false;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM