2012-02-16 44 views
-2

是否有可能只與MySQL的一個獨特的6或9位數字分配給每個新行。舉一個獨特的6或9位數字,以每行

例子:

id1 : 928524 
id2 : 124952 
id3 : 485920 
... 
... 

P.S:我能做到這與PHP的rand()功能,但我希望有一個更好的辦法。

+0

你可以使用自動增量列嗎? – 2012-02-16 17:43:06

+0

不,這不是我的情況。 – John 2012-02-16 17:43:53

+0

'not rand()'的任何原因? – sgowd 2012-02-16 17:44:03

回答

0

MySQL可以自行分配唯一的連續密鑰。如果你不想使用rand(),也許這就是你的意思?

+0

如果第一行的ID爲「300」,我不希望下一行的ID爲「301」。 – John 2012-02-16 17:45:56

+0

爲什麼?你有什麼可能的原因呢?這是爲了混淆嗎? – 2012-02-16 17:48:33

+0

就我而言,每個用戶都可以創建新頁面,例如:domain。com/124859,我不希望用戶通過在頁面中添加「1」來訪問每個創建的頁面......這就是爲什麼我需要隨機ID的原因。 – John 2012-02-16 17:52:21

0

我建議你手動設置第一行的ID到100000,然後告訴數據庫自動遞增。下一行應該是100001,然後是100002等等。每個獨特的。

+0

我不想要那樣的東西。如果第一行有ID:100000,我不想讓後面的行有ID:100001. – John 2012-02-16 17:49:10

+0

那麼,你能更精確地知道你想要什麼嗎? – jurgemaister 2012-02-16 17:51:46

+0

我網站上的每個註冊用戶都可以創建如下網頁:domain.com/928481,我希望網頁具有隨機ID,以便其他人無法訪問他們,如果他們沒有鏈接。 (有自動結合,問題在於下一行會=上一行+1,所以用戶可以很容易地找到它們。) – John 2012-02-16 17:56:27

0

不知道爲什麼你真的願意這樣做,但你將不得不使用PHP的rand函數,看看它已經在數據庫中,如果從開始重新開始,如果沒有,那麼用它來ID。

+0

我之前做過,直到現在。我問了這個問題,看看是否有另一種方式來做到這一點。 – John 2012-02-16 17:50:09

0

基本上你想有保證不會對你的輸入範圍碰撞的加密哈希。似乎沒有人知道MD5的碰撞行爲,所以這裏是一個的保證不會有任何的算法:選擇兩個大數M和N有沒有共同的divisors--他們可以是兩個非常大的素數,或2**643**50,或任何。您將生成0..M-1範圍內的數字。使用下面的散列函數:

H(k) = k*N (mod M)  

基本數論保證該序列具有範圍0..M-1沒有衝突。所以只要你的表中的ID小於M,你可以用這個函數對它們進行哈希處理,你就會得到明顯的哈希值。如果使用無符號64位整數算術,則可以讓M = 2**64。然後N可以是任意的奇數(我會選擇足夠大的東西來確保k * N> M),並且可以免費獲得模運算作爲算術溢出!

我寫評論下面,但我這裏最好重複一遍:這不是實現訪問保護的好方法。但是,如果M足夠大,它確實可以防止人們嘲笑你的所有內容。

相關問題