Whiz Tools

Gerador de CUID

Gere um ID resistente a colisões de forma rápida e fácil.

Estrutura do CUID

Timestamp:

Aleatório:

Gerador de CUID

Introdução

Um CUID (Identificador Único Resistente a Colisões) é um identificador único projetado para ser resistente a colisões, escalável horizontalmente e ordenável sequencialmente. Os CUIDs são particularmente úteis em sistemas distribuídos onde identificadores únicos precisam ser gerados sem coordenação entre os nós.

Estrutura dos CUIDs

Um CUID normalmente consiste nos seguintes componentes:

  1. Timestamp: Uma representação do tempo atual
  2. Contador: Um contador sequencial para garantir a exclusividade dentro do mesmo milissegundo
  3. Impressão digital do cliente: Um identificador único para a máquina ou processo que gera o CUID
  4. Componente aleatório: Dados aleatórios adicionais para reduzir ainda mais a probabilidade de colisão

A estrutura exata pode variar dependendo da implementação do CUID, mas esses componentes trabalham juntos para criar um identificador único e ordenável.

Aqui está uma representação visual de uma estrutura típica de CUID:

Timestamp Contador Impressão Digital Aleatório

Como os CUIDs são Gerados

Os CUIDs são gerados usando uma combinação de componentes baseados no tempo e aleatórios. O processo normalmente envolve:

  1. Obter o timestamp atual
  2. Incrementar um contador (que é redefinido periodicamente)
  3. Gerar uma impressão digital do cliente (geralmente feita uma vez por sessão ou início da aplicação)
  4. Adicionar dados aleatórios
  5. Combinar esses elementos em um formato específico

O CUID resultante é tipicamente representado como uma string de letras e números.

Vantagens e Casos de Uso

Os CUIDs oferecem várias vantagens em relação a outros sistemas de identificadores únicos:

  1. Resistência a colisões: A combinação de timestamp, contador e dados aleatórios torna colisões extremamente improváveis, mesmo em sistemas distribuídos.
  2. Escalabilidade horizontal: Os CUIDs podem ser gerados independentemente em várias máquinas sem coordenação.
  3. Ordenação sequencial: O componente de timestamp permite a ordenação cronológica dos CUIDs.
  4. Amigável para URL: Os CUIDs são tipicamente compostos de caracteres seguros para URL.

Casos de uso comuns para CUIDs incluem:

  • Chaves primárias de banco de dados
  • Sistemas distribuídos onde IDs únicos precisam ser gerados em vários nós
  • IDs de sessão em aplicações web
  • Rastreamento de eventos em sistemas de análise
  • Nomeação de arquivos ou recursos em sistemas de armazenamento em nuvem

Exemplos de Código

Aqui estão exemplos de geração de CUIDs em várias linguagens de programação:

// JavaScript (usando a biblioteca 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (usando a biblioteca 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (usando a gem 'cuid')
require 'cuid'
id = Cuid::generate
puts id
// Java (usando a biblioteca 'com.github.f4b6a3.cuid')
import com.github.f4b6a3.cuid.Cuid;

public class CuidExample {
    public static void main(String[] args) {
        String id = Cuid.createCuid();
        System.out.println(id);
    }
}
// C# (usando o pacote NuGet 'Cuid.Net')
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (usando o pacote 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (usando o pacote 'github.com/lucsky/cuid')
package main

import (
    "fmt"
    "github.com/lucsky/cuid"
)

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (usando o pacote 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (usando uma implementação personalizada)
#include <iostream>
#include <chrono>
#include <random>
#include <sstream>
#include <iomanip>

std::string generateCUID() {
    auto now = std::chrono::system_clock::now();
    auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
    auto value = now_ms.time_since_epoch();
    long duration = value.count();

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 35);

    std::stringstream ss;
    ss << 'c';
    ss << std::hex << std::setfill('0') << std::setw(8) << duration;
    for (int i = 0; i < 8; i++) {
        int r = dis(gen);
        ss << (char)(r < 10 ? '0' + r : 'a' + r - 10);
    }
    return ss.str();
}

int main() {
    std::string id = generateCUID();
    std::cout << id << std::endl;
    return 0;
}
% MATLAB (usando uma implementação personalizada)
function id = generateCUID()
    timestamp = dec2hex(round(posixtime(datetime('now'))*1000), 8);
    random = '';
    for i = 1:8
        random = [random char(randi([48 57 97 122]))];
    end
    id = ['c' timestamp random];
end

% Uso
id = generateCUID();
disp(id);
## R (usando uma implementação personalizada)
library(lubridate)

generate_cuid <- function() {
  timestamp <- format(as.numeric(now()) * 1000, scientific = FALSE)
  timestamp <- substr(timestamp, 1, 8)
  random <- paste0(sample(c(0:9, letters[1:6]), 8, replace = TRUE), collapse = "")
  paste0("c", timestamp, random)
}

## Uso
id <- generate_cuid()
print(id)
' Excel VBA (usando uma implementação personalizada)
Function GenerateCUID() As String
    Dim timestamp As String
    Dim random As String
    Dim i As Integer
    
    timestamp = Right("00000000" & Hex(CLng(CDbl(Now()) * 86400000)), 8)
    
    For i = 1 To 8
        random = random & Mid("0123456789abcdef", Int(Rnd() * 16) + 1, 1)
    Next i
    
    GenerateCUID = "c" & timestamp & random
End Function

' Uso em uma célula
'=GenerateCUID()

História e Desenvolvimento

Os CUIDs foram originalmente desenvolvidos por Eric Elliott em 2012 como uma solução para o problema de gerar identificadores únicos em sistemas distribuídos. O conceito foi inspirado no sistema de ID Snowflake do Twitter, mas projetado para ser mais facilmente implementado e utilizado em várias plataformas.

O desenvolvimento dos CUIDs foi impulsionado pela necessidade de um sistema de ID simples e resistente a colisões que pudesse funcionar em diferentes linguagens de programação e ambientes. O objetivo de Elliott era criar um sistema que fosse fácil de implementar, não exigisse coordenação central e pudesse escalar horizontalmente.

Desde sua criação, o CUID passou por várias iterações e melhorias:

  1. A implementação original do CUID focou na simplicidade e facilidade de uso.
  2. À medida que a adoção cresceu, a comunidade contribuiu com implementações em várias linguagens de programação.
  3. Em 2021, o CUID2 foi introduzido para abordar algumas limitações do CUID original e fornecer um desempenho e resistência a colisões ainda melhores.
  4. O CUID2 melhorou a versão original ao usar um gerador de números aleatórios mais seguro e aumentar o comprimento total do identificador.

A evolução dos CUIDs reflete as necessidades em mudança dos sistemas distribuídos e os esforços contínuos para equilibrar simplicidade, segurança e desempenho na geração de identificadores únicos.

Referências

  1. Repositório Oficial do CUID no GitHub
  2. Especificação do CUID2
  3. Elliott, Eric. "Gerando IDs Únicos em um Ambiente Distribuído." Medium, 2015.
  4. "IDs resistentes a colisões para Sistemas Distribuídos." DZone, 2018.

Esta ferramenta geradora de CUID permite que você gere rapidamente CUIDs para seus projetos. Basta clicar no botão "Gerar" para criar um novo CUID e usar o botão "Copiar" para copiá-lo para sua área de transferência para fácil uso em suas aplicações.

Feedback