如何在node.js中生成base62 UUIDs?

5
我正在寻找一种在node.js中生成base62 UUID的解决方案。我想避免使用base64,因为我打算根据这些UUID创建文件夹,而像“=”,“\”,“-”和“_”(在某些实现中)这样的字符并不那么人性化/适合文件系统。
在我的情况下,Base62还具有比typical v4 UUID更短的优势。
更新(为了清晰起见):我应该早点说我已经尝试使用base62模块,但是这不能解决我的问题,因为base62接受JavaScript整数,而数字只精确到52位,而UUID有128位。

1
base-x 似乎是与 uuid 的缓冲区支持一起使用的好选择。但这样做的代价是,您必须指定 base62 的字符范围,因为它没有任何预定义的范围。 - Jonathan Lonowski
确实如此,不确定我在搜索时是怎么错过的,谢谢Jonathan!与此同时,我已经开始着手解决方案了,等我完成后会进行比较。 - Dário
我刚刚将b62base-x进行了比较,base-x比我之前使用的方法要快得多。 - Dário
忘记了要附上代码链接:b62.vs.base-x.js - Dário
5个回答

12

以下是全面的答案:

解决方案A: base-x + node-uuid

受 @Jonathan 先前评论的启发。

使用 node-uuid 生成UUID,然后使用 base-x 进行编码:

var buf = new Buffer(16);
var uuid = Uuid.v4(null, buf);
var uuidB62 = baseX.encode(uuid);
// -> 71jbvv7LfRKYp19gtRLtkn

base-x非常快,因此这是最高效的解决方案。

解决方案B:uuid-base62

在了解base-x之前,我已经创建了一个用于base62编码的模块(b62)以及一个用于base62 UUID生成的模块:uuid-base62

var uuidB62 = uuidBase62.v4();  // -> 2qY9COoAhfMrsH7mCyh86T

这是一个简单的解决方案。目前它不如A快,因为b62要慢得多,但我打算用base-x替换它。

更新:uuid-base62已更新为使用base-x


uuid-base62 已在 v0.1.0 中更新为使用 base-x,因此不再具有以往的性能损失。 - Dário
1
请问您能否更新一下您的答案?我想尝试一下您的答案,但是使用Buffer构造函数已经被弃用了,而且node-uuid已经被uuid包替代了。 - user779159

2

更新:我最初指出的模块是用于将62进制数转换为10进制和反之的,所以不能使用。看起来原帖作者正在创建自己的模块来完成这个任务:https://github.com/dmarcelino/b62

有一个base62模块可供使用。以下是他们的示例代码:

Base62 = require('base62')
Base62.encode(999)  // 'g7' 
Base62.decode('g7') // 999

该模块可以使用npm install base62进行安装。如果要将其作为依赖项添加到您的package.json中,请改为使用npm install --save base62


1
注意:该模块似乎仅支持编码数字,而UUID的大小超出了可能的精度。 - Jonathan Lonowski
是的,非常准确,乔纳森。 - Dário
抱歉,我的错。好吧,还有原帖作者正在创建的节点模块:https://github.com/dmarcelino/b62 我更新了答案以包括它,但我想那不是一个很好的答案。 - Trott
没问题。是的,我在搜索后没有找到解决方案,已经开始着手处理了...一旦达到目标,我会发布我的结果。 - Dário

1

对于那些使用 Node.js 16+ 并且只依赖于 base-x 的人,这里有一个解决方案:

const crypto = require('crypto');
const BASE62 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
const base62 = require('base-x')(BASE62);

function generateBase62UUID() {
  const uuid = crypto.randomUUID();
  const buf = Buffer.from(uuid, 'utf-8');
  return base62.encode(buf);
}

0

安装软件包:

npm install uuid
npm install base-x

生成标识符:

const uuid = require('uuid')
const base62 = require('base-x')('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')

const id = base62.encode(Buffer.from(uuid.parse(uuid.v4())))

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接