Javascript 节点生成简短的唯一字母数字

Javascript 节点生成简短的唯一字母数字,javascript,node.js,Javascript,Node.js,我想生成一个简短的唯一字母数字值,用作在线购买的确认码。我已经研究过了,但是它们的UUID太长了,我希望它们大约有8个字符长。我能做到这一点的最佳方法是什么?10/23/15:也请参见下面的hashids答案 您可以借用URL shortener模型并执行以下操作: (100000000000).toString(36); // produces 19xtf1ts (200000000000).toString(36); // produces 2jvmu3nk var shortId =

我想生成一个简短的唯一字母数字值,用作在线购买的确认码。我已经研究过了,但是它们的UUID太长了,我希望它们大约有8个字符长。我能做到这一点的最佳方法是什么?

10/23/15:也请参见下面的hashids答案

您可以借用URL shortener模型并执行以下操作:

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

(200000000000).toString(36);
// produces 2jvmu3nk
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}
});
只需增加数字以保持其唯一性:

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

注意这只对“单实例”服务真正有用,这些服务不介意其排序方式的一定程度的可预测性(通过基本增量)。如果在多个应用程序/db实例中需要一个真正独特的值,您应该确实考虑到每个注释中的一个更完整的选项。

在这一点上有点晚,但看起来HasID在这个场景中会工作得很好。

哈希ID(哈希ID)从无符号整数创建短的、唯一的、可解密的哈希

如果您想将~8个字符作为目标,可以执行以下操作,至少需要8个字符

hashids = new Hashids("this is my salt", 8);
那么这个,

hash = hashids.encrypt(1);
// hash is now 'b9iLXiAa'
可接受的答案是可预测/可猜测的,此解决方案应该是唯一且不可预测的。

安装shortId模块()。 默认情况下,shortid会生成7-14个url友好字符:A-Z、A-Z、0-9、-,但如果您愿意,可以用其他字符替换和。 现在,当对象保存在数据库中时,您需要以某种方式将此shortId粘贴到对象上。最好的方法是将它们固定在模式中,如下所示:

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

(200000000000).toString(36);
// produces 2jvmu3nk
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}
});
我已经在这里对自己回答了类似的问题:


为此,我写了一个模块,可以做到这一点,甚至更多。
查看其页面:

如果每个在线购买都与唯一的URL关联,您可以使用软件包的后端,它不需要数据库连接,也不需要web服务:

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 
基于此,

你可以这样做

randomstring.generate({
  length: 8,
  charset: 'alphabetic'
});

Unique和short不能同时使用,除非你能保证它们有一个单一的来源,或者有一些互锁的方法,这样两个服务器就不会生成相同的字符串。如果你使用哈希函数,你可以尝试确定哈希结果当前可能最短的子字符串,类似于git缩写提交哈希的方式。谢谢你的提示。我最终使用了与您提供的类似的东西:var now=new Date();Math.floor(Math.random()*10)+parseInt(now.getTime()).toString(36).toUpperCase()解析int添加了什么?
(10000000000)。toString(36)
也同样有效吗?@teggy,使用random有什么意义<代码>(+new Date()).toString(36)应该为您提供唯一的id。或者:
数组。应用(0,数组(n)).reduce(函数(p){return p+(Math.random()*1e18)。toString(36)}',
将生成大约(12*
n
)长度的字符串。这种方法的唯一缺陷是它不能保证并行环境中的唯一性。两台机器或进程可能同时生成一个代码,您可能会有冲突。从1.0.0开始,HashID上的更新。将几个公共函数重命名为更合适的函数:函数encrypt()更改为encode(),函数decrypt()更改为decode(),函数encryptHex()更改为encodeHex(),函数decryptHex()更改为decodehx())链接已断开。对于简单的ID生成,加密和解密可能是昂贵的操作。Hi,shortId即使在服务器重新启动后也会给出唯一的字符串吗?但它需要一个正好包含64个字符的字典,因此即使替换-和u,它也不会是字母数字。