簡體   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