Whiz Tools

CUID Generatorius

Greitai ir lengvai generuokite kolizijoms atsparų ID.

CUID struktūra

Laiko žyma:

Atsitiktinis:

CUID Generator

Įvadas

CUID (Collision-resistant Unique IDentifier) yra unikalus identifikatorius, sukurtas taip, kad būtų atsparus kolizijoms, horizontaliai skalabilus ir sekuojamas. CUID yra ypač naudingas paskirstytose sistemose, kuriose unikalūs identifikatoriai turi būti generuojami be koordinavimo tarp mazgų.

CUID struktūra

CUID paprastai susideda iš šių komponentų:

  1. Laiko žyma: dabartinio laiko atvaizdavimas
  2. Skaitiklis: sekos skaitiklis, užtikrinantis unikalumą toje pačioje milisekundėje
  3. Kliento pirštų atspaudas: unikalus identifikatorius mašinai ar procesui, generuojančiam CUID
  4. Atsitiktinis komponentas: papildomi atsitiktiniai duomenys, siekiant dar labiau sumažinti kolizijų tikimybę

Tiksli struktūra gali skirtis priklausomai nuo CUID įgyvendinimo, tačiau šie komponentai veikia kartu, kad sukurtų unikalų ir sekuojamą identifikatorių.

Štai vizualinis tipinio CUID struktūros atvaizdavimas:

Laiko žyma Skaitiklis Pirštų atspaudas Atsitiktinis

Kaip generuojami CUID

CUID generuojami naudojant laiko ir atsitiktinių komponentų derinį. Procesas paprastai apima:

  1. Gauti dabartinę laiko žymą
  2. Padidinti skaitiklį (kuris periodiškai atsinaujina)
  3. Generuoti kliento pirštų atspaudą (paprastai atliekama vieną kartą per sesiją arba programos paleidimą)
  4. Pridėti atsitiktinius duomenis
  5. Sujungti šiuos elementus tam tikru formatu

Gautas CUID paprastai atvaizduojamas kaip raidžių ir skaičių eilutė.

Privalumai ir naudojimo atvejai

CUID siūlo kelis privalumus palyginti su kitomis unikalių identifikatorių sistemomis:

  1. Atsparumas kolizijoms: laiko žymos, skaitiklio ir atsitiktinių duomenų derinys daro kolizijas ekstremaliai mažai tikėtinas, net ir paskirstytose sistemose.
  2. Horizontalus skalavimas: CUID gali būti generuojami nepriklausomai keliuose kompiuteriuose be koordinavimo.
  3. Sekvencinis rūšiavimas: laiko žymos komponentas leidžia chronologiškai rūšiuoti CUID.
  4. URL draugiški: CUID paprastai sudaryti iš URL saugių simbolių.

Dažniausiai naudojami CUID atvejai apima:

  • Duomenų bazės pirminius raktus
  • Paskirstytas sistemas, kuriose unikalūs ID turi būti generuojami keliuose mazguose
  • Sesijos ID internetinėse programose
  • Įvykių sekimas analitikos sistemose
  • Failų ar išteklių pavadinimai debesų saugojimo sistemose

Kodo pavyzdžiai

Štai pavyzdžiai, kaip generuoti CUID įvairiose programavimo kalbose:

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

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

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

$id = Cuid::make();
echo $id;
// Go (naudojant 'github.com/lucsky/cuid' paketą)
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (naudojant 'CUID' paketą)
import CUID

let id = CUID()
print(id)
// C++ (naudojant savarankišką įgyvendinimą)
#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 (naudojant savarankišką įgyvendinimą)
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

% Naudojimas
id = generateCUID();
disp(id);
## R (naudojant savarankišką įgyvendinimą)
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)
}

## Naudojimas
id <- generate_cuid()
print(id)
' Excel VBA (naudojant savarankišką įgyvendinimą)
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

' Naudojimas ląstelėje
'=GenerateCUID()

Istorija ir plėtra

CUID buvo iš pradžių sukurtas Eric Elliott 2012 m. kaip sprendimas unikalių identifikatorių generavimo problemoms paskirstytose sistemose. Koncepcija buvo įkvėpta Twitter sniego kristalo ID sistemos, tačiau buvo sukurta taip, kad būtų lengviau įgyvendinama ir naudojama įvairiose platformose.

CUID plėtra buvo skatinama poreikio turėti paprastą, atsparų kolizijoms ID sistemą, kuri galėtų veikti įvairiose programavimo kalbose ir aplinkose. Elliott tikslas buvo sukurti sistemą, kuri būtų lengvai įgyvendinama, nereikalautų centrinio koordinavimo ir galėtų horizontaliai skalotis.

Nuo pat savo atsiradimo CUID praėjo kelis etapus ir patobulinimus:

  1. Pirmasis CUID įgyvendinimas buvo orientuotas į paprastumą ir naudojimo patogumą.
  2. Augant naudojimui, bendruomenė prisidėjo prie įgyvendinimų įvairiose programavimo kalbose.
  3. 2021 m. buvo pristatytas CUID2, siekiant išspręsti kai kurias originalaus CUID ribas ir suteikti dar geresnį našumą bei atsparumą kolizijoms.
  4. CUID2 patobulino originalą, naudodamas saugesnį atsitiktinių skaičių generatorių ir padidindamas identifikatoriaus ilgį.

CUID evoliucija atspindi besikeičiančius paskirstytų sistemų poreikius ir nuolatines pastangas subalansuoti paprastumą, saugumą ir našumą unikalių identifikatorių generavime.

Nuorodos

  1. Oficiali CUID GitHub saugykla
  2. CUID2 specifikacija
  3. Elliott, Eric. "Unikalių ID generavimas paskirstytoje aplinkoje." Medium, 2015.
  4. "Atsparūs kolizijoms ID paskirstytoms sistemoms." DZone, 2018.

Šis CUID generatorius leidžia greitai generuoti CUID savo projektams. Tiesiog paspauskite mygtuką "Generuoti", kad sukurtumėte naują CUID, ir naudokite mygtuką "Kopijuoti", kad nukopijuotumėte jį į savo iškarpinę, kad būtų lengva naudoti savo programose.

Feedback