【问题标题】:Generating Post ID's like Facebook and similar sites生成帖子 ID,如 Facebook 和类似网站
【发布时间】:2016-08-03 19:11:29
【问题描述】:

假设我正在 Rails 中构建 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,但这似乎会产生一个很长的哈希值。

谢谢!

【问题讨论】:

  • 我不了解 Ruby,但我广泛使用 crc32 散列来获取各种对象的唯一 ID。转换为十六进制,它提供一个 8 个字符的哈希码,就像上面的十六进制代码一样。它在 Ruby 的 zlib module 中。

标签: ruby-on-rails url routes


【解决方案1】:
  1. 使用这两种方法有哪些优点/缺点?

使用序号

优点:易于实施

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

使用随机数

优点:解决了视频中提到的问题:顺序记录攻击

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

Base 64(用这个代替十六进制)

优点:64 位熵意味着 5 个字符长的 ID 将有 64^5 种可能的排列。这允许相对较短的 URL。为此使用SecureRandom.urlsafe_base64

缺点:没有,真的。

  1. 是否有良好的行业标准或最佳实践来为用户、群组、帖子等概念生成合成 ID。

据我所知,没有。任何足够随机且足够长的东西都应该没问题。在您的模型中,您需要检查是否先获取 ID,以免出现重复,但除此之外几乎无需担心。

  1. 在 Ruby/Rails 中生成这些 ID 的最佳方式是什么?我知道 SecureRandom.hex,但这似乎会产生很长的哈希值。

就像我上面说的,我推荐使用SecureRandom.urlsafe_base64

【讨论】:

  • 我注意到urlsafe_base64 会生成类似于rkwyKkspOPgc901UP-xmtA 的内容,这对于URL 来说仍然很长。也许只取前 5 个字符是一种好习惯吗?正如您所提到的,这仍然是 64^5(超过 10 亿)个组合,而且我的数据库永远不会超过 100,000 条记录。我只是不知道算法是否出于某种原因以一种模式生成了这些字符,导致前几个字符重复或不适合在唯一 id 方案中使用
  • 最好只取前 x 个字符。只要确保你有一个模型方法来确保没有冲突
【解决方案2】:

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

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

是否有良好的行业标准或最佳实践来为用户、群组、帖子等概念生成合成 ID。

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

在 Ruby/Rails 中生成这些 ID 的最佳方式是什么?我知道 SecureRandom.hex,但这似乎会生成一个长哈希。

SecureRandom.uuid

作为 uuid 的更人性化和更好的替代方案,您可以使用 SecureRandom.urlsafe_base64,但它更有可能生成非唯一值。

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 2011-08-05
    • 1970-01-01
    • 2012-11-08
    • 2018-08-16
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多