簡體   English   中英

Mysql PHP中的隨機數生成

[英]Random Number Generation in Mysql PHP

我有1600萬條記錄,並且每個記錄都需要一個8位數的UNIQUE隨機數,我也希望所有數字都以01開頭,並將它們存儲在單獨的表中,因此我可以為每個記錄分配UNIQUE數。

我不確定如何在PHP中執行此操作以獲取1600萬個唯一編號?

請幫忙?!

J.

使用您指定的內容,這似乎是不可能的。

您需要從給定的8位數字中獲得16,000,000個唯一數字,其中前導2為01

這樣您只剩下6個數字 ,因此您的范圍將是1,000,000個數字

01000000到01999999

這似乎根本不正確。

約翰,關於您對pavium的評論,如果您需要所有數字的長度完全相同,但不一定是隨機的,則可以使用ZEROFILL MySQL屬性以及auto_increment索引。

試試這個:GUID

<? 
    echo str_replace ("}","",str_replace("{","",com_create_guid()));
?>

最簡單的方法是先生成一個16M數字列表,然后對它們進行隨機排序,然后將每個映射到您的記錄,這幾乎可以在PHP本機函數中完成。

我添加了一個步進循環,以便它不會生成太大的數組。 但這也意味着id看起來有點像無能為力,但仍然是隨機數。

也許有人可以使用旋轉字符串想出更好的解決方案? 我現在下班了。 :)

為每條記錄生成唯一編號的通常方法是具有一個auto_incrementing值-因此它們將是唯一的,但不是隨機的。

..並且它們將由MySQL而不是PHP生成。 我認為在PHP中生成1600萬個隨機但不同的數字將是巨大的開銷。

這些數字必須是隨機的嗎? 也許唯一性是更重要的要求?

與其隨機生成數字並努力保持已選擇的曲目號,不如按順序生成數字但按隨機順序更新記錄呢?

因此,這是一個完全MySQL解決方案。 沒有PHP,沒有循環,只是一個批處理更新語句:

UPDATE 
   your_table, 
   (SELECT @rownum:=@rownum+1 rownum, t.id 
    FROM 
      (SELECT @rownum:=0) r, 
      (SELECT id FROM your_table ORDER BY RAND()) t
   ) p 
SET unique_num = 100000000 + p.rownum 
WHERE p.id = your_table.id

更換your_table與表名, unique_num與這里獨特的號碼將被存儲於列和id與你的表的主鍵列。

p / s:經過測試至少可以在MySQL 5.1.37上運行

讓mysql為您做:

  1. 創建一個auto_increment列
  2. 使用UPDATE添加100000000
  3. 完成了!

如果您確實需要前導零,則從列中刪除auto_increment,將其更改為varchar(10)並使用UPDATE附加0

我喜歡為隨機主鍵使用16個字符的基數為60的varchar。 這是一張小桌子:

mysql> create table foo (k varchar(16), v varchar(255), primary key(k));

...這是一些基本的PHP,它將擊中函數k()直到找到未使用的鍵。

<?php

require_once 'connect.php';

$v = 'A value that needs a unique random key.';

while (!mysql_query("INSERT INTO foo VALUES ('" . k() . "', '$v')")) {};

function k() {
   $t = "0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
   $r = "";
   for ($i = 0; $i < 16; $i++) {
      $r .= substr($t, rand(0, 59), 1);
   }
   return $r;
}

?>

發生碰撞的機會很小,為-60至16,因此k()幾乎永遠不會被調用兩次。 獎勵:如果我需要將該鍵變大,那就是varchar,這樣我就可以添加字節而不會占用表中已經存在的所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM