Whiz Tools

Генератор на CUID

Бързо и лесно генерирайте ID, устойчиво на сблъсъци.

Структура на CUID

Времеви печат:

Случаен:

Генератор на CUID

Въведение

CUID (Collision-resistant Unique IDentifier) е уникален идентификатор, проектиран да бъде устойчив на сблъсъци, хоризонтално мащабируем и последователно сортиран. CUID-ите са особено полезни в разпределени системи, където уникални идентификатори трябва да бъдат генерирани без координация между възлите.

Структура на CUID-ите

CUID обикновено се състои от следните компоненти:

  1. Времеви печат: Представление на текущото време
  2. Личен номер: Последователен номер, за да се осигури уникалност в рамките на същата милисекунда
  3. Клиентски отпечатък: Уникален идентификатор за машината или процеса, генериращ CUID
  4. Случаен компонент: Допълнителни случайни данни, за да се намали допълнително вероятността от сблъсъци

Точната структура може да варира в зависимост от реализацията на CUID, но тези компоненти работят заедно, за да създадат уникален и сортиран идентификатор.

Ето визуално представяне на типичната структура на CUID:

Времеви печат Личен номер Отпечатък Случаен

Как се генерират CUID-ите

CUID-ите се генерират, използвайки комбинация от времеви и случайни компоненти. Процесът обикновено включва:

  1. Получаване на текущия времеви печат
  2. Увеличаване на личния номер (който се нулира периодично)
  3. Генериране на клиентски отпечатък (обикновено се извършва веднъж на сесия или стартиране на приложението)
  4. Добавяне на случайни данни
  5. Комбиниране на тези елементи в специфичен формат

Резултатният CUID обикновено се представя като низ от букви и цифри.

Предимства и случаи на употреба

CUID-ите предлагат няколко предимства пред други системи за уникални идентификатори:

  1. Устойчивост на сблъсъци: Комбинацията от времеви печат, личен номер и случайни данни прави сблъсъците изключително малко вероятни, дори в разпределени системи.
  2. Хоризонтално мащабиране: CUID-ите могат да бъдат генерирани независимо на множество машини без координация.
  3. Последователно сортиране: Компонентът на времевия печат позволява хронологично сортиране на CUID-ите.
  4. URL-приятелски: CUID-ите обикновено са съставени от символи, безопасни за URL.

Общи случаи на употреба на CUID-ите включват:

  • Основни ключове на база данни
  • Разпределени системи, където уникални ID-та трябва да бъдат генерирани на множество възли
  • Идентификатори на сесии в уеб приложения
  • Проследяване на събития в аналитични системи
  • Именуване на файлове или ресурси в облачни системи за съхранение

Примери за код

Ето примери за генериране на CUID-и на различни програмни езици:

// JavaScript (използвайки библиотеката 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (използвайки библиотеката 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (използвайки библиотеката 'cuid')
require 'cuid'
id = Cuid::generate
puts id
// Java (използвайки библиотеката '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# (използвайки пакета 'Cuid.Net' от NuGet)
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (използвайки пакета 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (използвайки пакета 'github.com/lucsky/cuid')
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (използвайки пакета 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (използвайки собствена реализация)
#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 (използвайки собствена реализация)
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

% Употреба
id = generateCUID();
disp(id);
## R (използвайки собствена реализация)
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)
}

## Употреба
id <- generate_cuid()
print(id)
' Excel VBA (използвайки собствена реализация)
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

' Употреба в клетка
'=GenerateCUID()

История и развитие

CUID-ите са разработени първоначално от Ерик Елиът през 2012 г. като решение на проблема с генерирането на уникални идентификатори в разпределени системи. Концепцията е вдъхновена от системата за ID на Twitter Snowflake, но проектирана да бъде по-лесно реализирана и използвана в различни платформи.

Развитието на CUID-ите е движено от необходимостта от проста, устойчива на сблъсъци система за идентификатори, която може да работи в различни програмни езици и среди. Целта на Елиът беше да създаде система, която е лесна за реализиране, не изисква централна координация и може да мащабира хоризонтално.

От създаването си, CUID е преминал през няколко итерации и подобрения:

  1. Първоначалната реализация на CUID се фокусираше върху простота и лесна употреба.
  2. С нарастващата популярност, общността допринесе с реализации на различни програмни езици.
  3. През 2021 г. беше представен CUID2, за да се адресират някои ограничения на оригиналния CUID и да се предостави дори по-добра производителност и устойчивост на сблъсъци.
  4. CUID2 подобри оригинала, като използва по-сигурен генератор на случайни числа и увеличи общата дължина на идентификатора.

Еволюцията на CUID-ите отразява променящите се нужди на разпределените системи и непрекъснатите усилия за балансиране на простота, сигурност и производителност в генерирането на уникални идентификатори.

Референции

  1. Официално хранилище на CUID в GitHub
  2. Спецификация на CUID2
  3. Елиът, Ерик. "Генериране на уникални ID-та в разпределена среда." Medium, 2015.
  4. "Идентификатори, устойчиви на сблъсъци за разпределени системи." DZone, 2018.

Този инструмент за генериране на CUID ви позволява бързо да генерирате CUID-и за вашите проекти. Просто натиснете бутона "Генерирай", за да създадете нов CUID, и използвайте бутона "Копирай", за да го копирате в клипборда си за лесна употреба в приложенията ви.

Feedback