为URI(JavaScript/NodeJS)生成唯一字符串
我正在写一个网站,我想为每篇文章生成一个随机链接。 我希望链接是唯一的。但我也想确保我可以有10万篇文章与独特的链接。(我使用的是MongoDB-mongoose)。 链接示例:qw463253qqrASd。 符号的最大数量:15为URI(JavaScript/NodeJS)生成唯一字符串,javascript,node.js,mongodb,mongoose,ecmascript-6,Javascript,Node.js,Mongodb,Mongoose,Ecmascript 6,我正在写一个网站,我想为每篇文章生成一个随机链接。 我希望链接是唯一的。但我也想确保我可以有10万篇文章与独特的链接。(我使用的是MongoDB-mongoose)。 链接示例:qw463253qqrASd。 符号的最大数量:15 var PostSchema = new Schema({ title: String, url: {type: String, unique: true, default: (() => { let gen = "", poss
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;
})()},
...
});
附言:我确实有一个生成数字数组的函数。看看这个模块
不过,有关此模块的一些警告:
- 它没有很积极地维持李>
- 它目前拒绝使用
4.x版或更高版本李>mongoose
- 它生成的ID往往以一个、两个或三个零开始
可能还有其他类似的模块。“我在使用MongoDB”为什么不使用ObjectId?它们安全吗?Mongo ObjectId和UUID对于人性化URL来说太长了。您当前的解决方案是正确的,但是请理解,如果您在数据库中已经存在标识符的情况下实现重试逻辑,那么您可以使用更短的字符串(即更人性化的字符串)。例如,imgur.com多年来一直使用5个字符的标识符,直到它们必须增加到7个。是的,随着文章的增多,您的重试逻辑将花费越来越多的时间重试,因为冲突越来越多。但在你接近10亿篇文章之前,这种情况是不会发生的,这几乎是imgur.com从5到7长度标识符时的图像数量:你应该小心。
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
},
});