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