2016-08-03 65 views
1

比方說我要建在Rails的生成帖子的ID,如Facebook和類似的網站

Facebook的克隆目前我的路線是非常標準的,像

/group/1/post/3 

我很想做一些合成的ID使用與Facebook等網站相同的編號方案。似乎有兩種類型的路由美學

# Only numbers 
/group/10101830214008379/post/159476674458072 

# Hash/Hex 
/group/da295c4b/post/815fe818 

外 -

  1. 有哪些優點/缺點使用兩種方法?
  2. 是否有一個好的行業標準或最佳實踐來爲用戶,組,帖子等概念生成合成ID。
  3. Ruby/Rails中生成每個ID的最佳方式是什麼?我知道SecureRandom.hex,但似乎會產生一個長散列。

謝謝!

+1

我不知道Ruby,但我廣泛使用'crc32'散列來爲各種對象的唯一ID。轉換爲十六進制,它提供了一個8字符的散列碼,就像上面的十六進制代碼一樣。它位於Ruby的[zlib模塊](http://stackoverflow.com/questions/4273281/how-to-calculate-32-bit-crc-in-ruby-on-rails)中。 –

回答

1
  1. 使用這兩種方法有什麼優點/缺點?

使用序列號

優點:易於實施

缺點:攻擊的可能載體。請參閱this video以獲得高級概述。

使用隨機數

優點:解決了視頻重新列出的問題:順序記錄攻擊

缺點:由於只有10熵位,ID的必須,如果要長很多你應用程序增長。

基本64(使用此來代替十六進制)

優點:熵64個比特意味着ID 5個字符長將具有64^5種可能的排列。這允許相對較短的URL。爲此,使用SecureRandom.urlsafe_base64

缺點:沒有,真的。

  • 是否有一個良好的行業標準或最佳實踐生成合成IDS像用戶,論壇,帖子等概念..
  • 要我知識,沒有。任何足夠的隨機性和足夠的長度應該沒問題。在你的模型中,你需要先檢查一下身份證是否被首先接受,這樣你就不會有重複,但除此之外沒什麼可擔心的。

    1. Ruby/Rails中生成每個ID的最佳方式是什麼?我知道SecureRandom.hex,但似乎產生一個長散列。

    就像我上面說的,我建議使用SecureRandom.urlsafe_base64

    +0

    我注意到'urlsafe_base64'生成了類似'rkwyKkspOPgc901UP-xmtA'的東西,這對於一個URL來說仍然很長。也許只是採取前5個字符是好習慣嗎?就像你提到的那樣,這仍然是64^5(超過10億)的組合,而我的數據庫將永遠不會超過100,000條記錄。我只是不知道這個算法是否出於某種原因產生了這樣的模式,使得前幾個字符重複或不適用於唯一的id方案 – user2490003

    +1

    僅採用前x個字符是很好的做法。只要確保你有一個模型方法來確保沒有碰撞 –

    1

    有哪些優點/缺點使用兩種方法?

    我認爲,主要優點是您可以生成一個新的實體(例如帖子),而不必依賴順序id生成(從數據庫)。這對於高併發或分佈式系統特別有用,您希望能夠創建新條目,而無需a)按順序執行創建,或者b)不會遇到衝突。

    是否有一個良好的行業標準或最佳實踐生成合成IDS像用戶,論壇,帖子等概念..

    UUID是一個廣泛使用的標準來進行。

    Ruby/Rails中生成每個ID的最佳方式是什麼?我知道SecureRandom.hex,但似乎產生一個長散列。

    SecureRandom.uuid 
    

    這樣更人性化友好和更好的替代品的UUID,你可以使用SecureRandom.urlsafe_base64,具有較高的概率雖然產生非唯一值。