创建简短、唯一的对象id';MongoDB的s

创建简短、唯一的对象id';MongoDB的s,mongodb,mongoid,Mongodb,Mongoid,我正在使用Rails/Mongoid制作一个类似instagram的应用程序。我想要一个唯一的ID,我可以在url中使用,如 最简单的方法是什么?我可以从Mongo创建的默认BSON ObjectID派生这样的ID吗?您可以尝试使用ObjectID的前4个字节(它们将表示时间戳) 但是,为了100%安全,最好通过实现计数器来生成真正唯一的短id。您可以使用单独的集合来维护计数器的当前值 有关mongo的ObjectID结构的更多详细信息,请参见: 作为替代方案,您可以将十六进制字符串id表示转换

我正在使用Rails/Mongoid制作一个类似instagram的应用程序。我想要一个唯一的ID,我可以在url中使用,如


最简单的方法是什么?我可以从Mongo创建的默认BSON ObjectID派生这样的ID吗?

您可以尝试使用ObjectID的前4个字节(它们将表示时间戳)

但是,为了100%安全,最好通过实现计数器来生成真正唯一的短id。您可以使用单独的集合来维护计数器的当前值

有关mongo的ObjectID结构的更多详细信息,请参见:

作为替代方案,您可以将十六进制字符串id表示转换为基于36个符号(26个拉丁字母+10个数字)的表示。它显然会更短


似乎有一个ruby库可以进行这样的转换

试试gem

你可以试试Mongoid::Token

从文档中:

这个库是一个快速而简单的方法来生成唯一的、随机的 mongoid文档的令牌,如果您不能,或者 不想使用slug或默认的MongoDB id

Mongoid::Token有助于扭转这一局面:

更像这样:

为什么不使用

使用npm安装:

然后要求:

const shortid = require('shortid');
在猫鼬模式中:

新模式{
_身份证:{
类型:字符串,
默认值:shortid.generate
}
}
或者直接插入:

    users.insert({
        _id: shortid.generate()
        name: ...
        email: ...
        });

Hashids库用于生成这样的id。看看这里☞

@aav提到您可以使用前4个字节,但该值以秒为单位,您甚至可以每秒插入10.000或更多个字节。objectID的另一个东西是Uniq,您需要检查“何时”从重复值“写入关注点”中得到错误

new Date().getTime()-以毫秒为单位=>1557702577900为什么不使用最后4个字节

这段代码看起来很有趣:

还请检查ObjectID时间戳解析器:

或者您可以执行ObjectId().toString()并通过[nodejs、php和Manymore]创建此字符串的基

也许最好的选择是使用js timestamp中的4-5字节和INC bson然后通过hids散列该值


非常有用的答案,但为什么是22个拉丁字母+10位而不是26个拉丁字母+10位?我们可以更深入地使用52个拉丁字母、10位数字和一些其他文字
-
=),然后使用radix64得到长度
log64(2^96)=16
而不是原始
log16(2^96)=24
    users.insert({
        _id: shortid.generate()
        name: ...
        email: ...
        });
Database 3milion rows numeric increment "_id" size on disk => 76MB, default object id => 86MB