2016-08-03 34 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,具有较高的概率虽然产生非唯一值。