如何生成唯一的纯整数ID,如Facebook Twitter

2022-08-30 22:25:00

在搜索SO和其他网站后,我未能拿出确凿的证据来证明Facebook,Twitter和Pinterest如何生成他们的ID。需要这样做的原因是为了避免URL冲突。移动到完全不同的 ID 将防止这种情况,因为不会有千万亿的记录。

  • Facebook.com/username/posts/ 362095193814294
  • Pinterest.com/pin/ 62487513549577588
  • Twitter.com/#!/username/status/ 17994686627061761

如果您以Pinterest为例,前几个数字与用户ID相关,最后6个左右的数字表示保存ID,这可能是自动增量。

要创建一个类似的ID,但不是唯一的,我可以使用:.这里的问题是它不是唯一的,例如:vs. .这两者是相同的。只需合并两组唯一的数字,仍然会产生重复的结果。投入到组合中基本上可以修复重复项,但这似乎不是一个很好的做法。base_convert(user_id.save_id, 16, 10)base_convert(15.211, 16, 10)base_convert(152.11, 16, 10)uniqid()

更新:Twitter似乎使用了这个:https://github.com/twitter/snowflake

关于生成唯一ID的任何建议,如上面的示例所示?


答案 1

假设您的 ID 都是数字。用字符分隔它们(因为它肯定不会出现在原始ID中),并进行从基数-11到基数-10的基本转换。A

对于您所做的示例,我们现在得到不同的结果:

echo base_convert("15A211", 11, 10); //247820
echo base_convert("152A11", 11, 10); //238140

答案 2

上面的Flickr评论非常有用。我们也使用分片。我们有一个大的(int64)定位器字段。它是通过组合 int (int32) 数据库 ID 和 int (int32) 标识字段生成的。

如果您知道您将拥有一个 int16 个数据库最大值(很有可能),则可以将 int16(smallint) 数据库 ID 和 int32(int) 用户 ID 以及 int16(smallint) 操作 ID 组合在一起。我不知道您的申请的合理数字。但是,为数据库 ID 保留一些部分,即使它只是很小,这样您就知道,如果您添加更多数据库,您将来是安全的。


推荐