Whiz Tools

CUID Generator

Genereer snel en eenvoudig een botsingsbestendige ID.

CUID Structuur

Tijdstempel:

Willekeurig:

CUID Generator

Inleiding

Een CUID (Collision-resistant Unique IDentifier) is een unieke identificator die is ontworpen om botsingen te weerstaan, horizontaal schaalbaar te zijn en sequentieel sorteerbaar. CUID's zijn bijzonder nuttig in gedistribueerde systemen waar unieke identificators moeten worden gegenereerd zonder coördinatie tussen knooppunten.

Structuur van CUID's

Een CUID bestaat doorgaans uit de volgende componenten:

  1. Tijdstempel: Een weergave van de huidige tijd
  2. Teller: Een sequentiële teller om uniciteit binnen dezelfde milliseconde te waarborgen
  3. Klantvingerafdruk: Een unieke identificator voor de machine of het proces dat de CUID genereert
  4. Willekeurig component: Extra willekeurige gegevens om de kans op botsingen verder te verminderen

De exacte structuur kan variëren afhankelijk van de CUID-implementatie, maar deze componenten werken samen om een unieke en sorteerbare identificator te creëren.

Hier is een visuele weergave van een typische CUID-structuur:

Tijdstempel Teller Vingerafdruk Willekeurig

Hoe CUID's worden gegenereerd

CUID's worden gegenereerd met een combinatie van tijdgebaseerde en willekeurige componenten. Het proces omvat doorgaans:

  1. Het verkrijgen van de huidige tijdstempel
  2. Het verhogen van een teller (die periodiek opnieuw wordt ingesteld)
  3. Het genereren van een klantvingerafdruk (meestal eenmaal per sessie of bij het starten van de applicatie)
  4. Het toevoegen van willekeurige gegevens
  5. Het combineren van deze elementen in een specifiek formaat

De resulterende CUID wordt doorgaans weergegeven als een tekenreeks van letters en cijfers.

Voordelen en gebruiksgevallen

CUID's bieden verschillende voordelen ten opzichte van andere systemen voor unieke identificatie:

  1. Botsingsbestendigheid: De combinatie van tijdstempel, teller en willekeurige gegevens maakt botsingen extreem onwaarschijnlijk, zelfs in gedistribueerde systemen.
  2. Horizontale schaalbaarheid: CUID's kunnen onafhankelijk op meerdere machines worden gegenereerd zonder coördinatie.
  3. Sequentiële sortering: De tijdstempelcomponent maakt chronologische sortering van CUID's mogelijk.
  4. URL-vriendelijk: CUID's bestaan doorgaans uit URL-veilige tekens.

Veelvoorkomende gebruiksgevallen voor CUID's zijn onder andere:

  • Primaire sleutels in databases
  • Gedistribueerde systemen waar unieke ID's moeten worden gegenereerd over meerdere knooppunten
  • Sessie-ID's in webapplicaties
  • Het volgen van gebeurtenissen in analysesystemen
  • Bestands- of hulpbronbenaming in cloudopslagsystemen

Code Voorbeelden

Hier zijn voorbeelden van het genereren van CUID's in verschillende programmeertalen:

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

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

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

$id = Cuid::make();
echo $id;
// Go (met het 'github.com/lucsky/cuid' pakket)
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (met het 'CUID' pakket)
import CUID

let id = CUID()
print(id)
// C++ (met een aangepaste implementatie)
#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 (met een aangepaste implementatie)
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

% Gebruik
id = generateCUID();
disp(id);
## R (met een aangepaste implementatie)
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)
}

## Gebruik
id <- generate_cuid()
print(id)
' Excel VBA (met een aangepaste implementatie)
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

' Gebruik in een cel
'=GenerateCUID()

Geschiedenis en Ontwikkeling

CUID's zijn oorspronkelijk ontwikkeld door Eric Elliott in 2012 als een oplossing voor het probleem van het genereren van unieke identificators in gedistribueerde systemen. Het concept was geïnspireerd door het Snowflake ID-systeem van Twitter, maar ontworpen om gemakkelijker te implementeren en te gebruiken in verschillende platforms.

De ontwikkeling van CUID's werd gedreven door de behoefte aan een eenvoudig, botsingsbestendig ID-systeem dat kon werken over verschillende programmeertalen en omgevingen. Elliott's doel was om een systeem te creëren dat eenvoudig te implementeren was, geen centrale coördinatie vereiste en horizontaal kon schalen.

Sinds de oprichting zijn CUID's door verschillende iteraties en verbeteringen gegaan:

  1. De oorspronkelijke CUID-implementatie richtte zich op eenvoud en gebruiksgemak.
  2. Naarmate de adoptie groeide, droegen de gemeenschap bij aan implementaties in verschillende programmeertalen.
  3. In 2021 werd CUID2 geïntroduceerd om enkele beperkingen van de oorspronkelijke CUID aan te pakken en nog betere prestaties en botsingsbestendigheid te bieden.
  4. CUID2 verbeterde de oorspronkelijke door gebruik te maken van een veiligere willekeurige getallengenerator en de totale lengte van de identificator te vergroten.

De evolutie van CUID's weerspiegelt de veranderende behoeften van gedistribueerde systemen en de voortdurende inspanningen om eenvoud, veiligheid en prestaties in de generatie van unieke identificators in balans te brengen.

Referenties

  1. Officiële CUID GitHub Repository
  2. CUID2 Specificatie
  3. Elliott, Eric. "Generating Unique IDs in a Distributed Environment." Medium, 2015.
  4. "Collision-resistant IDs for Distributed Systems." DZone, 2018.

Deze CUID-generator tool stelt je in staat om snel CUID's voor je projecten te genereren. Klik eenvoudig op de knop "Genereren" om een nieuwe CUID te maken, en gebruik de knop "Kopiëren" om deze naar je klembord te kopiëren voor gemakkelijke toepassing in je applicaties.

Feedback