2012-02-27 84 views
0

我已經做了串產生:如何使隨機字符串生成器篩選出重複的字符串?

<?php 

function createRandomPassword() { 
    $chars = "abcdefghijkmnopqrstuvwxyz023456789"; 
    srand((double)microtime()*1000000); 
    $i = 0; 
    $pass = '' ; 
    while ($i <= 12) { 
     $num = rand() % 33; 
     $tmp = substr($chars, $num, 1); 
     $pass = $pass . $tmp; 
     $i++; 
    } 
    return $pass; 
} 


// Usage 
$product_names = array(); 
for ($i=0; $i < 100; $i++) 
$product_names[] = "code-" . createRandomPassword(); 
?> 

我的問題是,我認爲這是一個機會,這可能會重複的值,它非常重要,這並不發生,因爲我將產生其中約70萬元。

有沒有一種確保生成的字符串不重複的好方法?

謝謝:)

+4

爲什麼要去所有這些麻煩?只需使用sha1()或md5()。同樣,您不會在循環的每次迭代中重新生成PRNG。你一次種下它,並且php在第一次調用rand()時自動爲你做。實際上,如果您正在測試並且每次都需要相同的「隨機」流,則只能手動進行種子處理。 – 2012-02-27 14:47:29

回答

1

下面的例子將產生100個的產品名稱,刪除重複,併產生新的產品名稱,直到產物名稱陣列具有100

$cnt = 0; 
$product_names = array(); 
while($cnt < 100) { 
    for ($i=0; $i < 100 - $cnt; $i++) 
    $product_names[] = "code-" . createRandomPassword(); 
    $product_names = array_unique($product_names); 
    $cnt = count($product_names); 
} 

計數你可以把數字100到一個變量或常數並與700,000交換。

0

有幾個選項:

  1. 產生700000個唯一的字符串和隨機他們。
  2. 使用GUIDs

雖然你的代碼表明,他們作爲密碼;如果他們確實是這樣,那麼不要擔心重複,因爲沒有明顯的候選可能性更大(例如passwordqwerty123)。

0

創建一個查找/檢查表(在一個數據庫或文件中),或者創建一個算法來創建一個更好的唯一鍵(使用md5或者sha或者被設計爲唯一的東西)。

+1

這裏有些挑剔:SHA1和MD5的設計不是無衝突的,但碰撞概率非常低(這意味着它們在實踐中應該是無碰撞的)。 – chiborg 2012-02-27 14:58:35

+1

@chiborg:據瞭解,並且很受歡迎,但是基於OP的帖子,任何有[1%]碰撞機率的東西都會比使用rand()和固定字符串有一個__vast__改進。 – 2012-02-27 15:18:06