Nodejs生成短的唯一字母数字

时间:2012-06-11 18:52:49

标签: javascript node.js

我想生成一个简短的唯一字母数字值,用作在线购物的确认码。我正在研究https://github.com/broofa/node-uuid,但是他们的uuids太长了,我希望它们长约8个字符。我能做到这一点的最佳方式是什么?

6 个答案:

答案 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}
});

我已经在这里回答了类似的问题:

  

Shorten ObjectId in node.js and mongoose

答案 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'
});