我想生成一个简短的唯一字母数字值,用作在线购物的确认码。我正在研究https://github.com/broofa/node-uuid,但是他们的uuids太长了,我希望它们长约8个字符。我能做到这一点的最佳方式是什么?
答案 0 :(得分:36)
在这个问题上稍晚一点,但看起来像哈希在这种情况下会很好用。
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'
接受的答案是可预测的/可猜测的,这个解决方案应该是独一无二且不可预测的。
答案 1 :(得分:35)
10/23/15:请参阅下面的hashids答案!
您可以借用URL缩短器模型并执行以下操作:
(100000000000).toString(36);
// produces 19xtf1ts
(200000000000).toString(36);
// produces 2jvmu3nk
只需增加数字即可保持唯一:
function(uniqueIndex) {
return uniqueIndex.toString(36);
}
注意这对于“单实例”服务非常有用,这些服务不介意订购方式的某种可预测性(通过基本增量)。如果您需要在多个应用程序/数据库实例中拥有真正独特的值,那么您应该根据某些注释考虑更全面的选项。
答案 2 :(得分:0)
安装shortId模块(https://www.npmjs.com/package/shortid)。 默认情况下,shortid会生成7-14个友好网址字符:A-Z,a-z,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}
});
我已经在这里回答了类似的问题:
答案 3 :(得分:0)
为此,我写了一个可以做到这一点的模块。 查看其页面:id-shorter
答案 4 :(得分:0)
如果与唯一网址相关联的每次在线购买,您都可以使用不需要数据库连接的simple-short包的后端,也不能使用网络服务:
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
答案 5 :(得分:0)
基于此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'
});