我想生成一个简短的唯一字母数字值,用作在线购买的确认码。我正在研究https://github.com/broofa/node-uuid但他们的 uuid 太长了,我想让它们大约 8 个字符长。我可以实现这一目标的最佳方法是什么?
6 回答
2015 年 10 月 23 日:请参阅下面的 hashids 答案!
您可以从 URL 缩短器模型中借用并执行以下操作:
(100000000000).toString(36);
// produces 19xtf1ts
(200000000000).toString(36);
// produces 2jvmu3nk
只需增加数字以保持其唯一性:
function(uniqueIndex) {
return uniqueIndex.toString(36);
}
请注意,这仅对“单实例”服务真正有用,这些服务不介意以这种方式排序(通过基本增量)具有一定的可预测性。如果您需要跨多个应用程序/数据库实例的真正独特的价值,您真的应该根据一些评论考虑一个功能更全的选项。
这个有点晚了,但似乎 hashids 在这种情况下工作得很好。
https://github.com/ivanakimov/hashids.node.js
hashids(哈希 ID)从无符号整数创建短的、唯一的、可解密的哈希
var Hashids = require('hashids'),
hashids = new Hashids('this is my salt');
var hash = hashids.encrypt(12345);
// hash is now 'ryBo'
var numbers = hashids.decrypt('ryBo');
// numbers is now [ 12345 ]
如果你想定位 ~ 8 个字符,你可以这样做,以下要求至少 8 个字符。
hashids = new Hashids("this is my salt", 8);
那么这个:
hash = hashids.encrypt(1);
// hash is now 'b9iLXiAa'
接受的答案将是可预测/可猜测的,该解决方案应该是唯一且不可预测的。
安装 shortId 模块(https://www.npmjs.com/package/shortid)。默认情况下,shortid 会生成 7-14 个 url 友好字符:AZ、az、0-9、_- 但您可以根据需要将 - 和 _ 替换为其他一些字符。现在,当您将对象保存在数据库中时,您需要以某种方式将此 shortId 粘贴到您的对象上。最好的方法是将它们粘贴在 Schema 中,如下所示:
var shortId = require('shortid');
var PurchaseConfirmationSchema = mongoose.Schema({
/* _id will be added automatically by mongoose */
shortId: {type: String, unique: true, default: shortId.generate}, /* WE SHOULD ADD THIS */
name: {type: String},
address: {type: String}
});
我已经在这里回答了自己类似的问题:
为此,我编写了一个可以做到这一点甚至更多的模块。看它的页面:id-shorter
如果每次在线购买都关联唯一 URL ,您可以使用简单短包的后端,不需要数据库连接,也不需要网络服务:
var shorten=require('simple-short');
shorten.conf({length:8}); // Default is 4.
code1=shorten('http://store.com/purchase1');
code2=shorten('http://store.com/purchase2');
//.. so on
基于此https://www.npmjs.com/package/randomstring
var randomstring = require("randomstring");
randomstring.generate();
// >> "XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT"
randomstring.generate(7);
// >> "xqm5wXX"
randomstring.generate({
length: 12,
charset: 'alphabetic'
});
// >> "AqoTIzKurxJi"
randomstring.generate({
charset: 'abc'
});
// >> "accbaabbbbcccbccccaacacbbcbbcbbc"
你可以这样做
randomstring.generate({
length: 8,
charset: 'alphabetic'
});