【发布时间】:2011-08-22 21:46:51
【问题描述】:
我正在使用 Rails/Mongoid 制作一个类似于 instagram 的应用程序。我想要一个可以在 http://instagr.am/p/DJmU8/ 等网址中使用的唯一 ID
最简单的方法是什么?我可以从 Mongo 创建的默认 BSON ObjectID 派生出这样的 ID 吗?
【问题讨论】:
我正在使用 Rails/Mongoid 制作一个类似于 instagram 的应用程序。我想要一个可以在 http://instagr.am/p/DJmU8/ 等网址中使用的唯一 ID
最简单的方法是什么?我可以从 Mongo 创建的默认 BSON ObjectID 派生出这样的 ID 吗?
【问题讨论】:
您可以尝试使用 ObjectID 的前 4 个字节(它们将代表时间戳)。
但是,为了 100% 安全,最好通过实现一个计数器来生成真正唯一的短 id。您可以使用单独的集合来维护计数器的当前值。
更多关于 mongo 的 ObjectID 结构的细节可以在这里找到:http://www.mongodb.org/display/DOCS/Object+IDs
作为替代方案,您可以将转换十六进制字符串 id 表示形式转换为基于 36 个符号(26 个拉丁字母 + 10 个数字)的表示形式。显然会更短。
似乎有一个 ruby 库,可以进行这样的转换http://rubyworks.github.com/radix/
【讨论】:
_- =) 然后使用 radix64 我们得到长度 log64(2^96) = 16 而不是原来的 log16(2^96) = 24。
【讨论】:
你可以试试 Mongoid::Token
https://github.com/thetron/mongoid_token
来自文档:
这个库是一种快速而简单的方法来生成独特的、随机的 在你不能的情况下,你的 mongoid 文档的令牌,或者 不想使用 slug 或默认的 MongoDB ID。
Mongoid::Token 可以帮助扭转这一局面:
http://myawesomewebapp.com/video/4dcfbb3c6a4f1d4c4a000012/edit
变成类似这样的东西:
【讨论】:
为什么不使用dylang/shortid?
使用 npm 安装 npmjs.com/package/shortid:
npm i shortid
然后要求:
const shortid = require('shortid');
在猫鼬模式中:
new Schema {
_id: {
type: String,
default: shortid.generate
}
}
或者直接插入:
users.insert({
_id: shortid.generate()
name: ...
email: ...
});
【讨论】:
Hashids 库用于生成这样的 ID。看这里☞https://github.com/peterhellberg/hashids.rb
【讨论】:
@aav 提到你可以使用前 4 个字节,但这个值以秒为单位,你甚至可以获得每秒 10.000 或更多的插入。另一件事 objectID 是 Uniq,您需要检查“何时”从重复值“Write Concerns”中得到错误?
new Date().getTime() - 以毫秒为单位 => 1557702577900 为什么不使用最后 4 个字节?
这段代码看起来很有趣:
https://github.com/treygriffith/short-mongo-id/blob/master/lib/objectIdToShortId.js
还要检查 ObjectID 时间戳解析器:
https://steveridout.github.io/mongo-object-time/
或者你可以执行 ObjectId().toString() 并且这个字符串的基础由hashids [nodejs,php, andmanymore] 创建新的
也许最好的选择是使用来自 js 时间戳和 INC 的 4-5 个字节 bson 然后通过 hids 散列这个值
Database 3milion rows numeric increment "_id" size on disk => 76MB, default object id => 86MB
【讨论】: