Dicas e truques em JavaScript para gerar IDs exclusivos
Atenção! Este artigo foi traduzido do inglês para o português a partir da fonte informada ao final do artigo, escrita pelo autor Cihan. A tradução é fornecida apenas para fins informativos e não deve ser considerada como uma tradução oficial. Não me responsabilizo por quaisquer erros ou imprecisões que possam ter sido introduzidos na tradução. É altamente recomendável que você verifique a precisão do conteúdo com a fonte original em inglês.
Prefácio
Se você é um desenvolvedor e ainda não usou identificadores exclusivos, usará identificadores exclusivos no futuro. Você o usará ao adicionar uma nova entidade às APIs Restful ou ao indexar um novo objeto no banco de dados.
Normalmente, os desenvolvedores usam bibliotecas de terceiros. As bibliotecas mais usadas na comunidade são UUID e NanoID.
Neste artigo, estudaremos como usar identificadores exclusivos sem usar esses aplicativos de terceiros.
UUID
Um UUID (identificador universalmente exclusivo) é um identificador exclusivo.
UUID é para a criação de RFC4122 UUIDs
- Suporte — CommonJS, módulos ECMAScript e compilações CDN
- Seguro — Valores aleatórios criptograficamente fortes
- Pequeno — Dependência zero, pegada pequena, funciona bem com empacotadores “tree-shaking”
NanoID
O NanoID é um gerador de ID de string exclusivo, pequeno, seguro e compatível com URL para JavaScript.
- Pequeno — 130 bytes (minificados e gzipados). Sem dependências. Size Limit controla o tamanho.
- Seguro — Ele usa um gerador aleatório de hardware. Pode ser usado em clusters.
- IDs curtos — Usa um alfabeto maior que o UUID (A-Za-z0–9_-). Portanto, o tamanho do ID foi reduzido de 36 para 21 símbolos.
Web Crypto API
Podemos criar identificadores exclusivos por meio da Web Crypto API sem usar nenhum pacote.
MDN :
A Web Crypto API é uma interface que permite que um script use primitivas criptográficas para construir sistemas usando criptografia.
O método randomUUID() da interface Crypto é usado para gerar um UUID v4 usando um gerador de números aleatórios criptograficamente seguro.
Usando Crypto API, UUID e NanoID com JS
Agora vamos ver como todos eles são usados.
import { v4 as uuidv4 } from 'uuid'
import { nanoid } from 'nanoid'
const firstID = uuidv4()
console.log(firstID) // d120cc2d-56c5-46e6-891e-157976f7a991
const secondID = nanoid()
console.log(secondID) // JU26FrALFGbQDjM7ZvvIm
const thirdID = crypto.randomUUID()
console.log(thirdID) // b5ef7c93-3d47-4d37-8ac8-415809bcd56b
Se você quiser experimentá-lo sozinho, clique aqui
Usando Módulo Crypto, UUID e NanoId com NodeJs
Agora vamos ver como eles são usados no back-end.
import { v4 as uuidv4 } from 'uuid' // requires uuid package
import { nanoid } from 'nanoid' // requires nanoid package
import { randomUUID } from 'crypto' // built-in module
const firstID = uuidv4()
console.log(firstID) // ed8a0ac6-0d87-4bf6-8030-a7af71381dae
const secondID = nanoid()
console.log(secondID) // 6VBRGjJ2TdTXCpkEmCt0y
const thirdID = randomUUID()
console.log(thirdID) // ed75a761-e8b3-4b6c-895e-25ceacf2c015
A única diferença é importar o módulo de criptografia no nodejs.
Conclusão
Neste artigo vimos como podemos usar identificadores únicos sem usar nenhuma biblioteca.
No entanto, se você tiver um critério relacionado ao desempenho em seu aplicativo, poderá consultar o gráfico na página do github do nanoid e usar a biblioteca certa para você.
// De acordo com os dados compartilhados pela página github do nanoid
// According to the data shared by nanoid's github page
$ node ./test/benchmark.js
crypto.randomUUID 21,119,429 ops/sec
uuid v4 20,368,447 ops/sec
@napi-rs/uuid 11,493,890 ops/sec
uid/secure 8,409,962 ops/sec
@lukeed/uuid 6,871,405 ops/sec
nanoid 5,652,148 ops/sec
customAlphabet 3,565,656 ops/sec
secure-random-string 394,201 ops/sec
uid-safe.sync 393,176 ops/sec
cuid 208,131 ops/sec
shortid 49,916 ops/sec
Async:
nanoid/async 135,260 ops/sec
async customAlphabet 136,059 ops/sec
async secure-random-string 135,213 ops/sec
uid-safe 119,587 ops/sec
Non-secure:
uid 58,860,241 ops/sec
nanoid/non-secure 2,744,615 ops/sec
rndm 2,718,063 ops/sec