CUID Generator voor unieke identificatoren en systemen
Genereer botsingsbestendige unieke identificatoren (CUID's) voor gedistribueerde systemen, databases en webapplicaties. Deze tool maakt CUID's die schaalbaar, sorteerbaar en zeer onwaarschijnlijk zijn om te botsen.
CUID Generator
Genereer snel en eenvoudig een botsingsbestendige ID.
CUID Structuur
Tijdstempel:
Willekeurig:
Documentatie
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:
- Tijdstempel: Een weergave van de huidige tijd
- Teller: Een sequentiële teller om uniciteit binnen dezelfde milliseconde te waarborgen
- Klantvingerafdruk: Een unieke identificator voor de machine of het proces dat de CUID genereert
- 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:
Hoe CUID's worden gegenereerd
CUID's worden gegenereerd met een combinatie van tijdgebaseerde en willekeurige componenten. Het proces omvat doorgaans:
- Het verkrijgen van de huidige tijdstempel
- Het verhogen van een teller (die periodiek opnieuw wordt ingesteld)
- Het genereren van een klantvingerafdruk (meestal eenmaal per sessie of bij het starten van de applicatie)
- Het toevoegen van willekeurige gegevens
- 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:
- Botsingsbestendigheid: De combinatie van tijdstempel, teller en willekeurige gegevens maakt botsingen extreem onwaarschijnlijk, zelfs in gedistribueerde systemen.
- Horizontale schaalbaarheid: CUID's kunnen onafhankelijk op meerdere machines worden gegenereerd zonder coördinatie.
- Sequentiële sortering: De tijdstempelcomponent maakt chronologische sortering van CUID's mogelijk.
- 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:
1// JavaScript (met de 'cuid' bibliotheek)
2const cuid = require('cuid');
3const id = cuid();
4console.log(id);
5
1## Python (met de 'cuid' bibliotheek)
2import cuid
3id = cuid.cuid()
4print(id)
5
1## Ruby (met de 'cuid' gem)
2require 'cuid'
3id = Cuid::generate
4puts id
5
1// Java (met de 'com.github.f4b6a3.cuid' bibliotheek)
2import com.github.f4b6a3.cuid.Cuid;
3
4public class CuidExample {
5 public static void main(String[] args) {
6 String id = Cuid.createCuid();
7 System.out.println(id);
8 }
9}
10
1// C# (met het 'Cuid.Net' NuGet-pakket)
2using Cuid;
3
4class Program
5{
6 static void Main(string[] args)
7 {
8 string id = CuidGenerator.Generate();
9 Console.WriteLine(id);
10 }
11}
12
1// PHP (met het 'endyjasmi/cuid' pakket)
2<?php
3require 'vendor/autoload.php';
4use Endyjasmi\Cuid\Cuid;
5
6$id = Cuid::make();
7echo $id;
8
1// Go (met het 'github.com/lucsky/cuid' pakket)
2package main
3
4import (
5 "fmt"
6 "github.com/lucsky/cuid"
7)
8
9func main() {
10 id := cuid.New()
11 fmt.Println(id)
12}
13
1// Swift (met het 'CUID' pakket)
2import CUID
3
4let id = CUID()
5print(id)
6
1// C++ (met een aangepaste implementatie)
2#include <iostream>
3#include <chrono>
4#include <random>
5#include <sstream>
6#include <iomanip>
7
8std::string generateCUID() {
9 auto now = std::chrono::system_clock::now();
10 auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
11 auto value = now_ms.time_since_epoch();
12 long duration = value.count();
13
14 std::random_device rd;
15 std::mt19937 gen(rd());
16 std::uniform_int_distribution<> dis(0, 35);
17
18 std::stringstream ss;
19 ss << 'c';
20 ss << std::hex << std::setfill('0') << std::setw(8) << duration;
21 for (int i = 0; i < 8; i++) {
22 int r = dis(gen);
23 ss << (char)(r < 10 ? '0' + r : 'a' + r - 10);
24 }
25 return ss.str();
26}
27
28int main() {
29 std::string id = generateCUID();
30 std::cout << id << std::endl;
31 return 0;
32}
33
1% MATLAB (met een aangepaste implementatie)
2function id = generateCUID()
3 timestamp = dec2hex(round(posixtime(datetime('now'))*1000), 8);
4 random = '';
5 for i = 1:8
6 random = [random char(randi([48 57 97 122]))];
7 end
8 id = ['c' timestamp random];
9end
10
11% Gebruik
12id = generateCUID();
13disp(id);
14
1## R (met een aangepaste implementatie)
2library(lubridate)
3
4generate_cuid <- function() {
5 timestamp <- format(as.numeric(now()) * 1000, scientific = FALSE)
6 timestamp <- substr(timestamp, 1, 8)
7 random <- paste0(sample(c(0:9, letters[1:6]), 8, replace = TRUE), collapse = "")
8 paste0("c", timestamp, random)
9}
10
11## Gebruik
12id <- generate_cuid()
13print(id)
14
1' Excel VBA (met een aangepaste implementatie)
2Function GenerateCUID() As String
3 Dim timestamp As String
4 Dim random As String
5 Dim i As Integer
6
7 timestamp = Right("00000000" & Hex(CLng(CDbl(Now()) * 86400000)), 8)
8
9 For i = 1 To 8
10 random = random & Mid("0123456789abcdef", Int(Rnd() * 16) + 1, 1)
11 Next i
12
13 GenerateCUID = "c" & timestamp & random
14End Function
15
16' Gebruik in een cel
17'=GenerateCUID()
18
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:
- De oorspronkelijke CUID-implementatie richtte zich op eenvoud en gebruiksgemak.
- Naarmate de adoptie groeide, droegen de gemeenschap bij aan implementaties in verschillende programmeertalen.
- In 2021 werd CUID2 geïntroduceerd om enkele beperkingen van de oorspronkelijke CUID aan te pakken en nog betere prestaties en botsingsbestendigheid te bieden.
- 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
- Officiële CUID GitHub Repository
- CUID2 Specificatie
- Elliott, Eric. "Generating Unique IDs in a Distributed Environment." Medium, 2015.
- "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
Klik op de feedback-toast om feedback te geven over deze tool
Gerelateerde Tools
Ontdek meer tools die handig kunnen zijn voor uw workflow