假设我正在使用Rails构建Facebook克隆
目前我的路线很标准,比如
/group/1/post/3
我喜欢使用与Facebook这样的网站使用相同的编号方案制作一些合成ID。似乎有两种一般类型的路线
# Only numbers
/group/10101830214008379/post/159476674458072
# Hash / Hex
/group/da295c4b/post/815fe818
在美学之外 -
SecureRandom.hex
,但这似乎产生了一个长哈希。 谢谢!
答案 0 :(得分:1)
- 使用这两种方法有哪些优点/缺点?
醇>
使用序号
优点:易于实施
缺点:可能的攻击媒介。有关高级概述,请参阅this video。
使用随机数
优点:解决视频中列出的问题:连续记录攻击
缺点:由于只有10位熵,如果您的应用增长,ID必须更长。
Base 64(使用此代替十六进制)
优点:64位熵意味着ID 5 chars long将具有64 ^ 5个可能的排列。这允许相对更短的URL。请使用SecureRandom.urlsafe_base64
。
缺点:没有,真的。
- 是否有用于为用户,群组,帖子等概念生成合成ID的良好行业标准或最佳做法。
醇>
据我所知,没有。任何足够随机且足够长的东西应该没问题。在您的模型中,您想要检查是否首先获取了ID,这样您就不会有重复,但除此之外不用担心。
- Ruby / Rails生成每个ID的最佳方法是什么?我知道SecureRandom.hex但似乎生成了一个长哈希。
醇>
就像我上面所说,我建议使用SecureRandom.urlsafe_base64
答案 1 :(得分:1)
使用这两种方法有哪些优点/缺点?
我认为主要优点是您可以生成新实体(例如帖子),而不必依赖于序列ID生成(来自数据库)。这对于高度并发或分布式系统尤其有用,在这些系统中,您希望能够创建新条目而无需a)按序列创建或b)而不会遇到冲突。
是否有针对用户,群组,帖子等概念生成合成ID的良好行业标准或最佳做法。
UUID是一种广泛使用的标准。
Ruby / Rails生成每个ID的最佳方法是什么?我知道SecureRandom.hex,但似乎生成了一个长哈希。
SecureRandom.uuid
作为一种更加人性化且更好的uuids替代品,您可以使用SecureRandom.urlsafe_base64
,但生成非唯一值的概率更高。