【问题标题】:Generating unique Strings for URI (JavaScript/NodeJS)为 URI (JavaScript/NodeJS) 生成唯一的字符串
【发布时间】:2016-03-26 16:54:21
【问题描述】:

我正在写一个网站,我想为每篇文章生成一个随机链接。 我希望链接是唯一的。但我也想确保我可以拥有 100 000 篇带有唯一链接的文章。 (我正在使用 MongoDB - 猫鼬)。 示例链接:qw463253qqrASd。 符号数量上限:15。

var PostSchema = new Schema({
    title: String,
    url: {type: String, unique: true, default: (() => {
        let gen = "", possible = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789";
        range(100).forEach((value, index) => gen += possible.charAt(Math.floor(Math.random() * possible.length)));
        return gen;
    })()},
    ...
});

P.S.:我确实有一个生成数字数组的函数。

【问题讨论】:

  • “我正在使用 MongoDB” 那为什么不使用 ObjectIds 呢?
  • 这样使用安全吗?
  • Mongo ObjectIds 和 UUIDs 对于人类友好的 URL 来说往往太长了。您当前的解决方案是在正确的轨道上,但是如果您在数据库中已经存在标识符的情况下实施重试逻辑,您可以使用更短的字符串(即更加人性化)。例如,imgur.com 多年来一直使用 5 个字符的标识符,直到它们不得不增加到 7 个。
  • 是的,随着您获得更多文章,您的重试逻辑将花费越来越多的时间重试,因为有更多的冲突。但这不会发生,直到您接近 10 亿篇文章,这几乎是 imgur.com 从 5 到 7 长度标识符时拥有的图像数量:blog.imgur.com/2013/01/18/more-characters-in-filenames
  • 你应该注意with using Math.random()

标签: javascript node.js mongodb mongoose ecmascript-6


【解决方案1】:

看看mongoose-shortid 模块。

var ShortId = require('mongoose-shortid');

var PostSchema = new Schema({
    title: String,
    url: {
        type    : ShortId,
        len     : 15,
        base    : 62,
        alphabet: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
        retries : 4, // Four retries on collision
        index   : true
    },
});

关于这个模块的一些警告:

  • 它维护得不是很积极;
  • 目前拒绝使用mongoose 4.x 或更高版本;
  • 它生成的 id 往往以一个、两个或三个零开头。

也许还有其他类似的模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2013-02-09
    • 2012-11-21
    • 2010-10-18
    相关资源
    最近更新 更多