2014-02-10 64 views
1

而不是隻是看到我的帖子頁面爲/posts/1等,我寧願有一個隨機字符串,更像這樣/posts/299432。我做了一些研究,並在S.O.上找到了這個答案。取得我的帖子的ID是隨機的(但唯一)字符串

How to make model IDs in Rails unpredictable and random

它的工作,但我不認爲它開創了後一個唯一的ID,所以有一個小概率的帖子的ID將得到複製,我覺得。

我在這裏的問題是,該方法會創建獨特的字符串使用?或者我應該做一些不同的事情來爲我的帖子生成這些唯一的隨機ID?

謝謝

+0

唯一的保證你有確保唯一的ID來檢查是否已經分配了隨機生成的ID。或者...使用插件。 – zeantsoi

回答

2

是的,它會創建一個唯一的ID。從最高的投票答案:

while Model.where(:id => self.id).exists? 

這意味着它將繼續產生新的隨機數,直到它找到一個尚不存在。 (這很可能是第一次。)

+0

謝謝@Mischa! –

+0

如果您的服務處於負載狀態,那麼該循環可能會給您的數據庫帶來壓力。 – 2mia

3

這是一個更好的方法。您可以使用Hashids

+0

感謝您的回覆@marvelousNinja –

+0

Hashids很好,但是請將真實數字保存爲表格中的一些冗餘字段。這是因爲hashids是不透明的,如果你嘗試使用'JOIN'等YMMV,就不會很好。 –

2

一些選項:

  1. 開始在像299432有關的任意選擇的初始數,並且增量通過每次一個。

  2. 生成隨機的6位數字,並檢查數據庫以查看數字是否已被使用;如果有,則生成另一個隨機數並重復。

  3. 使用GUID(您可以編碼爲base64或不管你喜歡)。

  4. 如果因爲它產生順序值選項1是不能接受的,則可以通過Ñ每次代替遞增1,然後取模量對中號。只要NM是相對的素數,該序列將生成唯一的數字M。 (您也可以加一個偏移量,使數字大。)換句話說,生成(一個 +( * ñ))(MOD 中號)與ñ中號互質。如果您的帖子超過M,此方法顯然會失敗。

+0

感謝您的答案@dvnrrs –

相關問題