2011-03-31 26 views
1

這兩種方法之間的主要區別在於生成順序但有點獨特的數字?我想在MySQL數據庫中使用這樣一個數字作爲一個唯一的用戶ID,也可以作爲一個鹽來密碼。PHP - uniqid(「」,true)與uniqid(「」)+ mt_rand()

我的理解是,集羣和索引的原因,這些ID應該是連續的(我認識到,在某些情況下,隨機字符串將使該發生在同一個微秒非連續的兩個條目,但希望這是可以忽略不計。)

回答

2

所以是的,正如Gumbo指出的那樣,它不是一個散列,而是一個微秒級的分辨率遞增計時器值,可選地與一個隨機數連接在一起。所以,這些數值仍然不是連續的,但至少是穩定的。 這兩種方法之間的差異將非常小。

這個仍然成立:如果你需要獨特的順序數字,並且你使用MySQL,使用自動增量字段,他們就是這樣做的。

+1

'uniqid'完全不做任何散列。它會生成獨特的值。 – Gumbo 2011-03-31 11:13:13

+1

哦,我,你完全正確...我從哪裏得到的。 – Damon 2011-03-31 11:16:04

5

不使用更多的熵,uniqid基本上沒有以下(見source of uniqid.c):

$time = explode(' ', microtime(false)); 
return sprintf('%s%08x%05x', $prefix, $time[1], $time[0] * 1000000); 

因此,它基本上發生在微秒當前時間,並將其轉換爲十六進制表示,並將其附加到前綴。這已經提供了獨特的價值。

但是這些值並不完全隨機。爲了獲得更多的隨機值,你應該通過設置第二個參數more_entropy來增加更多的熵。在這種情況下,PHP的內部linear congruential generatorphp_combined_lcg(請參閱source of lgc.c)用於生成一個僞隨機數,該僞隨機數在最後附加,增加大約30位額外的熵以使它們更隨機。