Whiz Tools

Generátor CUID

Rýchlo a jednoducho generujte ID odolné voči kolíziám.

Štruktúra CUID

Časová pečiatka:

Náhodné:

Generátor CUID

Úvod

CUID (Collision-resistant Unique IDentifier) je jedinečný identifikátor navrhnutý tak, aby bol odolný voči kolíziám, horizontálne škálovateľný a sekvenčne usporiadaný. CUID-y sú obzvlášť užitočné v distribuovaných systémoch, kde je potrebné generovať jedinečné identifikátory bez koordinácie medzi uzlami.

Štruktúra CUID-ov

CUID sa typicky skladá z nasledujúcich komponentov:

  1. Časová pečiatka: Reprezentácia aktuálneho času
  2. Čítač: Sekvenčný čítač na zabezpečenie jedinečnosti v rámci tej istej milisekundy
  3. Odtlačok klienta: Jedinečný identifikátor pre stroj alebo proces generujúci CUID
  4. Náhodná zložka: Dodatočné náhodné údaje na ďalšie zníženie pravdepodobnosti kolízií

Presná štruktúra sa môže líšiť v závislosti od implementácie CUID, ale tieto komponenty spolupracujú na vytvorení jedinečného a usporiadateľného identifikátora.

Tu je vizuálne znázornenie typickej štruktúry CUID:

Časová pečiatka Čítač Odtlačok Náhodné

Ako sa generujú CUID-y

CUID-y sa generujú pomocou kombinácie časových a náhodných komponentov. Proces typicky zahŕňa:

  1. Získanie aktuálnej časovej pečiatky
  2. Inkrementácia čítača (ktorý sa periodicky resetuje)
  3. Generovanie odtlačku klienta (zvyčajne sa robí raz na reláciu alebo pri spustení aplikácie)
  4. Pridanie náhodných údajov
  5. Kombinovanie týchto prvkov v špecifickom formáte

Výsledný CUID sa zvyčajne reprezentuje ako reťazec písmen a čísel.

Výhody a použitia

CUID-y ponúkajú niekoľko výhod oproti iným systémom jedinečných identifikátorov:

  1. Odolnosť voči kolíziám: Kombinácia časovej pečiatky, čítača a náhodných údajov robí kolízie extrémne nepravdepodobnými, aj v distribuovaných systémoch.
  2. Horizontálna škálovateľnosť: CUID-y môžu byť generované nezávisle na viacerých strojoch bez koordinácie.
  3. Sekvenčné usporiadanie: Komponenta časovej pečiatky umožňuje chronologické usporiadanie CUID-ov.
  4. Bezpečné pre URL: CUID-y sa zvyčajne skladajú z URL-bezpečných znakov.

Bežné použitia CUID-ov zahŕňajú:

  • Primárne kľúče databázy
  • Distribuované systémy, kde je potrebné generovať jedinečné ID naprieč viacerými uzlami
  • ID relácií vo webových aplikáciách
  • Sledovanie udalostí v analytických systémoch
  • Názvoslovie súborov alebo zdrojov v cloudových úložiskách

Kódové príklady

Tu sú príklady generovania CUID-ov v rôznych programovacích jazykoch:

// JavaScript (používajúci knižnicu 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (používajúci knižnicu 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (používajúci gem 'cuid')
require 'cuid'
id = Cuid::generate
puts id
// Java (používajúci knižnicu '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# (používajúci balík NuGet 'Cuid.Net')
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (používajúci balík 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (používajúci balík 'github.com/lucsky/cuid')
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (používajúci balík 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (používajúci vlastnú implementáciu)
#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 (používajúci vlastnú implementáciu)
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

% Použitie
id = generateCUID();
disp(id);
## R (používajúci vlastnú implementáciu)
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)
}

## Použitie
id <- generate_cuid()
print(id)
' Excel VBA (používajúci vlastnú implementáciu)
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

' Použitie v bunke
'=GenerateCUID()

História a vývoj

CUID-y boli pôvodne vyvinuté Ericom Elliottom v roku 2012 ako riešenie problému generovania jedinečných identifikátorov v distribuovaných systémoch. Koncept bol inšpirovaný systémom ID Snowflake od Twitteru, ale navrhnutý tak, aby bol jednoduchšie implementovateľný a použiteľný naprieč rôznymi platformami.

Vývoj CUID-ov bol poháňaný potrebou jednoduchého, odolného ID systému, ktorý by mohol fungovať naprieč rôznymi programovacími jazykmi a prostrediami. Elliottovým cieľom bolo vytvoriť systém, ktorý by bol ľahko implementovateľný, nevyžadoval centrálnu koordináciu a mohol by sa horizontálne škálovať.

Od svojho vzniku prešli CUID-y niekoľkými iteráciami a vylepšeniami:

  1. Pôvodná implementácia CUID sa zameriavala na jednoduchosť a ľahké použitie.
  2. S rastom adopcie prispela komunita implementáciami v rôznych programovacích jazykoch.
  3. V roku 2021 bola predstavená CUID2 na riešenie niektorých obmedzení pôvodného CUID a poskytovanie ešte lepšej výkonnosti a odolnosti voči kolíziám.
  4. CUID2 vylepšil pôvodný koncept použitím bezpečnejšieho generátora náhodných čísel a zvýšením celkovej dĺžky identifikátora.

Evolúcia CUID-ov odráža meniace sa potreby distribuovaných systémov a neustále úsilie o vyváženie jednoduchosti, bezpečnosti a výkonu pri generovaní jedinečných identifikátorov.

Odkazy

  1. Oficiálne CUID GitHub úložisko
  2. Špecifikácia CUID2
  3. Elliott, Eric. "Generovanie jedinečných ID v distribuovanom prostredí." Medium, 2015.
  4. "Odolné ID pre distribuované systémy." DZone, 2018.

Tento nástroj na generovanie CUID vám umožňuje rýchlo generovať CUID-y pre vaše projekty. Jednoducho kliknite na tlačidlo "Generovať" a vytvorte nový CUID, a použite tlačidlo "Kopírovať", aby ste ho skopírovali do schránky pre jednoduché použitie vo vašich aplikáciách.

Feedback