2013-09-24 18 views
2

我需要生成像tinyurl的唯一的URL:domain.com/pgDzs7,domain.com/ab4dh3 但(!)問題是,我不希望用戶只需更改網址中的最後一個字母即可查看上一個和下一個網址。生成一個獨特的類似tinyurl的ID,但隨機(不是mysql的行id到base64)

例如,如果有人創建了一個獲得URL domain.com/pgDzs7的內容,我希望下一位訪問者獲得完全不同的唯一URL(例如,「ab4dh3」),以便沒有人無法找到這些URL已經生成並查看其他用戶的內容,除非他們知道其URL。

我在Stackoverflow上找到的所有內容都是將表的主整數鍵轉換爲base64格式。但我需要不同的解決方案,這也不會產生衝突,並且不會產生週期(如果可能的話),因爲我的MySQL表有幾十GB字節。

+0

我不認爲有辦法做到這一點,保證不會產生衝突。只要碰撞很少,你的'while'週期應該迭代1到2次,這應該不會太糟糕。只要您的數據庫中的值有索引,檢查代碼是否已被使用應該很快。 – Barmar

回答

0

我找到了更好的解決方案。我需要的只是將字母表[a-zA-Z0-9]進行隨機播放,以便訪問者無法迭代網址。至少它不會像以前那麼容易。

+0

當然,這不是最好的解決方案。但是,如果您需要防止迭代您的URL,它比傳統的base64轉換要好得多。 – Gregory

0

你可以使用模冪到您的鍵映射到一個不同的密鑰,您可以輕鬆地映射回原來的,利用模冪,其中模量與pq主要形式p*q的一些特殊性質。

具體的例子:

p=31 
q=17 
a=343 
b=7 

such that (a*b) = 1 mod (p-1)*(q-1) 

given original secret index "id", you have public index "pid" 

pid = id^a mod p*q 

and given the public id "pid" you can find the secret id 

id = pid^b mod p*q 

這產生下表:

id  pid  recovered_id 
0  0  0 
1  1  1 
2  349  2 
3  334  3 
4  64  4 
5  129  5 
6  99  6 
7  267  7 
8  202  8 
9  359  9 
10  226  10 
11  207  11 
12  296  12 
13  259  13 
etc 

直到(526),之後重複該循環P * Q-1的最大編號。

你需要更大的pq以及一個偏移量的id,但是principe肯定會工作。

+0

如果我在表中有4千萬條記錄,並計劃擁有高達150-200萬的話,那我該如何定義p/q/a/b變量?我有點困惑。 – Gregory

+0

@Gregory這基本上是在公鑰加密中發生的事情,所以你可以使用它的算法和工具。對於您的目的而言,這可能有點太過分了,但是,無需預先計算/呈現數百萬個唯一值,就可以確保以一種不可預測的1:1映射的合理安全方式。 – mvds

0

您可以製作一個公式來獲取下一個索引。 Like:LastID * 2 + 5

你不會有colisions或循環來檢查id是否曾用過。

+0

20000000 = 40000000 + 5 = 40000005和20000001 = 40000002 + 5 = 40000007 - 似乎沒有使ID看起來不同。 – Gregory

+0

20 = 40 + 5 ||| 45 = 90 + 5 ||| 95 = 190 + 5 ||| ... –

+0

那麼20和21呢?它是45和47. – Gregory