Executando verificação de segurança...
2

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