生成帖子ID,如Facebook和类似网站

时间:2016-08-03 19:11:30

标签: ruby-on-rails url routes

假设我正在使用Rails构建Facebook克隆

目前我的路线很标准,比如

/group/1/post/3

我喜欢使用与Facebook这样的网站使用相同的编号方案制作一些合成ID。似乎有两种一般类型的路线

# Only numbers
/group/10101830214008379/post/159476674458072

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

在美学之外 -

  1. 使用这两种方法有哪些优点/缺点?
  2. 是否有用于为用户,群组,帖子等概念生成合成ID的良好行业标准或最佳做法。
  3. Ruby / Rails生成每个ID的最佳方法是什么?我知道SecureRandom.hex,但这似乎产生了一个长哈希。
  4. 谢谢!

2 个答案:

答案 0 :(得分:1)

  
      
  1. 使用这两种方法有哪些优点/缺点?
  2.   

使用序号

优点:易于实施

缺点:可能的攻击媒介。有关高级概述,请参阅this video

使用随机数

优点:解决视频中列出的问题:连续记录攻击

缺点:由于只有10位熵,如果您的应用增长,ID必须更长。

Base 64(使用此代替十六进制)

优点:64位熵意味着ID 5 chars long将具有64 ^ 5个可能的排列。这允许相对更短的URL。请使用SecureRandom.urlsafe_base64

缺点:没有,真的。

  
      
  1. 是否有用于为用户,群组,帖子等概念生成合成ID的良好行业标准或最佳做法。
  2.   

据我所知,没有。任何足够随机且足够长的东西应该没问题。在您的模型中,您想要检查是否首先获取了ID,这样您就不会有重复,但除此之外不用担心。

  
      
  1. Ruby / Rails生成每个ID的最佳方法是什么?我知道SecureRandom.hex但似乎生成了一个长哈希。
  2.   

就像我上面所说,我建议使用SecureRandom.urlsafe_base64

答案 1 :(得分:1)

  

使用这两种方法有哪些优点/缺点?

我认为主要优点是您可以生成新实体(例如帖子),而不必依赖于序列ID生成(来自数据库)。这对于高度并发或分布式系统尤其有用,在这些系统中,您希望能够创建新条目而无需a)按序列创建或b)而不会遇到冲突。

  

是否有针对用户,群组,帖子等概念生成合成ID的良好行业标准或最佳做法。

UUID是一种广泛使用的标准。

  

Ruby / Rails生成每个ID的最佳方法是什么?我知道SecureRandom.hex,但似乎生成了一个长哈希。

SecureRandom.uuid

作为一种更加人性化且更好的uuids替代品,您可以使用SecureRandom.urlsafe_base64,但生成非唯一值的概率更高。