18

我想生成一个简短的唯一字母数字值,用作在线购买的确认码。我正在研究https://github.com/broofa/node-uuid但他们的 uuid 太长了,我想让它们大约 8 个字符长。我可以实现这一目标的最佳方法是什么?

4

6 回答 6

37

2015 年 10 月 23 日:请参阅下面的 hashids 答案!

您可以从 URL 缩短器模型中借用并执行以下操作:

(100000000000).toString(36);
// produces 19xtf1ts

(200000000000).toString(36);
// produces 2jvmu3nk

只需增加数字以保持其唯一性:

function(uniqueIndex) {
    return uniqueIndex.toString(36);
}

请注意,这仅对“单实例”服务真正有用,这些服务不介意以这种方式排序(通过基本增量)具有一定的可预测性。如果您需要跨多个应用程序/数据库实例的真正独特的价值,您真的应该根据一些评论考虑一个功能更全的选项。

于 2012-06-11T19:55:20.703 回答
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'

接受的答案将是可预测/可猜测的,该解决方案应该是唯一且不可预测的。

于 2013-04-19T17:17:58.813 回答
1

安装 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}
});

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

在 node.js 和 mongoose 中缩短 ObjectId

于 2015-04-07T09:09:28.313 回答
0

为此,我编写了一个可以做到这一点甚至更多的模块。看它的页面:id-shorter

于 2015-12-04T19:38:37.770 回答
0

如果每次在线购买都关联唯一 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 
于 2016-07-18T20:16:57.360 回答
-1

基于此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'
});
于 2018-08-23T10:44:22.237 回答