2012-09-18 32 views
0

我不希望我的數據庫的ID是連續的,所以我想生成與此代碼的UID:有多少個字節對於twitter來說足夠獨特?

$bin = openssl_random_pseudo_bytes(12); 
$hex = bin2hex($bin); 
return base_convert($hex, 16, 36); 

我的問題是:有多少字節,我會需要做的ID唯一不夠處理大量的記錄(如Twitter)?

+0

爲什麼你不希望你的數據庫ID是連續的?如果這只是爲了顯示,我建議你找到一種方法來顯示它們,但在數據庫中留下連續的ID。 – Brad

+0

@Brad更安全,讓我隱藏我的應用程序的增長。 –

+0

請定義鉅額。你除了什麼增長? –

回答

2

您可能會考慮類似tinyurl和其他縮短服務的工作方式。我已經使用了類似的技術,它保證了唯一性,直到所有的組合都用完爲止。所以基本上你選擇一個字母表,以及你想要多少個字符作爲長度。假設我們使用字母數字,高位和低位,所以這是字母表中的62個字符,並且讓我們每個代碼執行5個字符。這是62^5 = 916,132,832的組合。

你開始你的順序數據庫ID和你乘上出現一些質數(任選其一這是相當大的,像2097593)。你所要做的就是將你的數據庫ID乘以數字,如果超過62^5,請確保回捲,然後按照您選擇的字母表將該數字轉換爲基數62。

這使得每個代碼看起來相當獨特的,但因爲我們使用一個素數,我們保證不會兩次擊中同一個號碼,直到我們使用的所有代碼了。而且非常短。

如果長度不是問題,您也可以使用較小字母表的較長鍵。

這裏有一個問題,我沿着相同的路線問:Tinyurl-style unique code: potential algorithm to prevent collisions

3

使用PHP的uniqid(),增加了一個熵因子。這會給你足夠的空間。

+0

uniqid基本上是基於microtime,所以它不是不可預測的... –

+1

@hugo_leonardo:是嗎,你能預測它現在會是什麼樣子嗎?你怎麼可能知道在生成ID時確切的microtime是什麼。請告訴我,99.9%的原因足夠隨機,而你的看起來並不像0.01%。 –

+0

知道一個ID,那麼用一點蠻力猜測下一個(或前一個)會很容易。但是,無論如何......根據@Jan的身份證應該只有數字,所以uniqid不會這樣做。 –

0

使用MySQL的UUID

insert into `database`(`unique`,`data`) values(UUID(),'Test'); 

如果你不使用UUID(數據庫名稱),它MySQL的搜索谷歌會給你一個選項

源維基百科

換句話說,生成1份十億後僅UUID的每一秒鐘在未來100年裏,創建只有一個重複的概率會約50%

0

假設openssl_random_pseudo_bytes可以產生每一個可能的值,N個字節會給你2^(N * 8)不同的值。對於12個字節,這是7.923 * 10^28

相關問題