MongoDB自定义和唯一ID

Chr*_*ris 12 mongodb

我使用MongoDB的,我想生成博客文章独特的cryptical标识(将在宁静的网址都必须使用),如s52ruf6wstxR2ru286zjI.

您认为什么是最好的,以及生成这些ID的更具可扩展性的方式?

我在考虑以下架构:

  • 定期(每日?)批处理运行以生成大量随机和唯一ID,并使用InsertIfNotPresent将它们插入专用的MongoDB集合中
  • 每次我想要生成一篇新的博客文章时,我从这个集合中获取一个ID,并使用UpdateIfCurrent原子操作将其标记为"take"

WDYT?

Jus*_*ins 32

这正是MongoDB的开发人员以他们的方式构建他们的ObjectID(_id)的原因...... 在节点之间进行扩展等.

BSON ObjectID是一个12字节的值,由4字节时间戳(自纪元以来的秒数),3字节机器ID,2字节进程ID和3字节计数器组成.请注意,与BSON的其余部分不同,时间戳和计数器字段必须以big endian存储.这是因为它们是逐字节比较的,我们希望确保大多增加订单.这是架构:

0123   456      78    91011
time   machine  pid   inc
Run Code Online (Sandbox Code Playgroud)

传统数据库通常使用单调递增的主键序列号.在MongoDB中,首选方法是使用对象ID.对象ID与分片和分发更具协同性.

http://www.mongodb.org/display/DOCS/Object+IDs

所以我要说只使用ObjectID

转换为字符串时它们并没有那么糟糕(这些是在彼此之后插入的)......

例如:

4d128b6ea794fc13a8000001
4d128e88a794fc13a8000002
Run Code Online (Sandbox Code Playgroud)

他们乍一看是"可猜测的",但他们真的不容易猜到......

4d128 b6e a794fc13a8000001
4d128 e88 a794fc13a8000002
Run Code Online (Sandbox Code Playgroud)

对于一个博客,我不认为这是一个很大的交易......我们在整个地方都使用它.

  • 你也可以base64编码,大约有16个字符.或者base85大约有12个. (6认同)
  • ObjectIds是否"容易"猜测,完全取决于谁在做猜测.对于一个随意的网络浏览器,不,但对任何值得他们的盐的黑客来说这些都是微不足道的猜测.如果您需要安全的ID,请不要使用ObjectIds,basewhatever-encoded或其他 - 使用像安全生成的UUID那样真正随机的东西. (6认同)