2010-07-19 80 views
5

我試圖生成具有相同的樣式bit.ly網址喜歡的UUID:Ruby on Rails的 - 產生bit.ly風格的UUID

http://bit.ly/aUekJP 

或cloudapp的:

http://cl.ly/1hVU 

這更小

我該怎麼辦? 我現在使用的UUID寶石紅寶石,但我不知道是否有可能限制長度,並得到像這樣的東西。 我目前使用這樣的:

UUID.generate.split("-")[0] => b9386070 

但我想有更小,知道這將是獨一無二的。

任何幫助將非常感謝:)

回答

14

你是混淆了兩個這裏不同的東西。 UUID是一個通用唯一的標識符。即使數百萬人同時在世界各地創作,它的獨特可能性也非常高。它通常顯示爲一個36位數的字符串。你不能砍掉前8個字符,並期望它是唯一的。

Bitly,tinyurl et-al存儲鏈接並生成代碼表示該鏈接的短代碼。他們不會從他們在數據存儲中查找代碼的代碼重建URL,並返回相應的URL。這些不是UUIDS。

不知道你的應用程序很難告訴你應該使用什麼方法,但是你可以用數字鍵存儲你指向的數據存儲區中的任何內容,然後使用10位數字將密鑰重新綁定到base32, 22個小寫字母,或許是避免像「O」「I」明顯的錯字問題,「L」等

編輯

在進一步的調查有一個Ruby base32 gem推出實現了道格拉斯Crockford的Base 32 implementation

有5字符Base32字符串可以表示超過3300萬整數和超過10億的6位數字串。

+0

感謝提供的信息史蒂夫,是的,我想我真的誤解了uuid原則:/ base32 gem看起來非常好,我只是想找出一種基於記錄id生成短url的正確方法,我正在使用字符串ID和分配UUID方法給它,但我想現在我可以回到一個整數ID,然後如果例如,在363012開始id計數,例如,我會得到一個'B2G4'字符串表示。我希望這可以按照你上面解釋的一樣。 – zanona 2010-07-19 17:00:11

+0

@lucdco。這正是我所說的。 – 2010-07-20 09:13:11

+0

@SteveWeet感謝您推薦的base32 gem – 2012-05-13 11:49:36

-10

保證唯一性的唯一方法是保持一個全球性的計數和增加它每次使用:00000001

+3

這並不是保證唯一性的唯一途徑。 – 2011-03-24 02:31:08

10

如果你與數字打交道,你可以使用內置的Ruby方法

6175601989.to_s(30) 
=> "8e45ttj" 

回去

"8e45ttj".to_i(30) 
=>6175601989 

所以你不必來存儲任何東西,你總是可以解碼一個傳入的short_code。

這適用於概念驗證,但您無法避免模糊字符,如:1lji0o。如果你只是想使用代碼來模糊數據庫記錄ID,這將工作正常。一般而言,短代碼應該易於記憶並從一種媒介轉移到另一種媒介,如在某人的演示幻燈片上閱讀,或通過電話收聽。如果您需要避免難以閱讀或難以聽到的字符,則可能需要切換到您生成可接受的代碼並存儲的過程。

+0

'to_i'接受高達36的基數,因此您可以將更多信息打包成幾個字符。 – jpadvo 2013-02-22 22:51:36

0

我覺得這是短期和可靠:

def create_uuid(prefix=nil) 
    time = (Time.now.to_f * 10_000_000).to_i 
    jitter = rand(10_000_000) 
    key = "#{jitter}#{time}".to_i.to_s(36) 
    [prefix, key].compact.join('_') 
end 

這吐出來,看起來像這種獨特的鍵:「3qaishe3gpp07w2m
減少「抖動」的大小,以減少密鑰大小。

警告: 這並不能保證是唯一的(使用SecureRandom.uuid爲該),但它是非常可靠:

10_000_000.times.map {create_uuid}.uniq.length == 10_000_000