Генератор уникальных идентификаторов CUID для систем
Генерируйте уникальные идентификаторы (CUID), устойчивые к коллизиям, для распределенных систем, баз данных и веб-приложений. Этот инструмент создает CUID, которые масштабируемы, сортируемы и крайне маловероятно, что они столкнутся.
Генератор CUID
Быстро и легко генерируйте идентификаторы, устойчивые к коллизиям.
Структура CUID
Временная метка:
Случайный:
Документация
Генератор CUID
Введение
CUID (Collision-resistant Unique IDentifier) — это уникальный идентификатор, разработанный для того, чтобы быть устойчивым к коллизиям, горизонтально масштабируемым и последовательно сортируемым. CUID особенно полезны в распределенных системах, где уникальные идентификаторы необходимо генерировать без координации между узлами.
Структура CUID
CUID обычно состоит из следующих компонентов:
- Временная метка: представление текущего времени
- Счетчик: последовательный счетчик для обеспечения уникальности в пределах одной миллисекунды
- Отпечаток клиента: уникальный идентификатор для машины или процесса, генерирующего CUID
- Случайный компонент: дополнительные случайные данные для дальнейшего снижения вероятности коллизий
Точная структура может варьироваться в зависимости от реализации CUID, но эти компоненты работают вместе, чтобы создать уникальный и сортируемый идентификатор.
Вот визуальное представление типичной структуры CUID:
Как генерируются CUID
CUID генерируются с использованием комбинации временных и случайных компонентов. Процесс обычно включает:
- Получение текущей временной метки
- Увеличение счетчика (который периодически сбрасывается)
- Генерация отпечатка клиента (обычно выполняется один раз за сессию или при запуске приложения)
- Добавление случайных данных
- Объединение этих элементов в определенном формате
Результирующий CUID обычно представляется в виде строки букв и цифр.
Преимущества и области применения
CUID предлагают несколько преимуществ по сравнению с другими системами уникальных идентификаторов:
- Устойчивость к коллизиям: комбинация временной метки, счетчика и случайных данных делает коллизии крайне маловероятными, даже в распределенных системах.
- Горизонтальная масштабируемость: CUID могут генерироваться независимо на нескольких машинах без координации.
- Последовательная сортировка: компонент временной метки позволяет хронологически сортировать CUID.
- Дружественность к URL: CUID обычно состоят из символов, безопасных для URL.
Распространенные области применения CUID включают:
- Первичные ключи баз данных
- Распределенные системы, где уникальные идентификаторы необходимо генерировать на нескольких узлах
- Идентификаторы сессий в веб-приложениях
- Отслеживание событий в аналитических системах
- Именование файлов или ресурсов в облачных системах хранения
Примеры кода
Вот примеры генерации CUID на различных языках программирования:
1// JavaScript (с использованием библиотеки 'cuid')
2const cuid = require('cuid');
3const id = cuid();
4console.log(id);
5
1## Python (с использованием библиотеки 'cuid')
2import cuid
3id = cuid.cuid()
4print(id)
5
1## Ruby (с использованием гемы 'cuid')
2require 'cuid'
3id = Cuid::generate
4puts id
5
1// Java (с использованием библиотеки 'com.github.f4b6a3.cuid')
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# (с использованием пакета 'Cuid.Net' NuGet)
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 (с использованием пакета 'endyjasmi/cuid')
2<?php
3require 'vendor/autoload.php';
4use Endyjasmi\Cuid\Cuid;
5
6$id = Cuid::make();
7echo $id;
8
1// Go (с использованием пакета 'github.com/lucsky/cuid')
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 (с использованием пакета 'CUID')
2import CUID
3
4let id = CUID()
5print(id)
6
1// C++ (с использованием пользовательской реализации)
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 (с использованием пользовательской реализации)
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% Использование
12id = generateCUID();
13disp(id);
14
1## R (с использованием пользовательской реализации)
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## Использование
12id <- generate_cuid()
13print(id)
14
1' Excel VBA (с использованием пользовательской реализации)
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' Использование в ячейке
17'=GenerateCUID()
18
История и развитие
CUID были изначально разработаны Эриком Эллиотом в 2012 году как решение проблемы генерации уникальных идентификаторов в распределенных системах. Концепция была вдохновлена системой идентификаторов Snowflake от Twitter, но разработана так, чтобы быть более легко реализуемой и используемой на различных платформах.
Разработка CUID была вызвана необходимостью создать простую, устойчивую к коллизиям систему идентификации, которая могла бы работать на разных языках программирования и в разных средах. Целью Эллиота было создать систему, которая была бы проста в реализации, не требовала центральной координации и могла бы масштабироваться горизонтально.
С момента своего появления CUID прошли несколько итераций и улучшений:
- Исходная реализация CUID была сосредоточена на простоте и удобстве использования.
- По мере роста популярности сообщество внесло свои реализации на различных языках программирования.
- В 2021 году была представлена CUID2, чтобы устранить некоторые ограничения оригинального CUID и обеспечить еще лучшую производительность и устойчивость к коллизиям.
- CUID2 улучшила оригинал, используя более безопасный генератор случайных чисел и увеличив общую длину идентификатора.
Эволюция CUID отражает изменяющиеся потребности распределенных систем и постоянные усилия по балансировке простоты, безопасности и производительности в генерации уникальных идентификаторов.
Ссылки
- Официальный репозиторий CUID на GitHub
- Спецификация CUID2
- Эллиот, Эрик. "Генерация уникальных идентификаторов в распределенной среде." Medium, 2015.
- "Устойчивые к коллизиям идентификаторы для распределенных систем." DZone, 2018.
Этот инструмент генерации CUID позволяет вам быстро генерировать CUID для ваших проектов. Просто нажмите кнопку "Сгенерировать", чтобы создать новый CUID, и используйте кнопку "Копировать", чтобы скопировать его в буфер обмена для удобного использования в ваших приложениях.
Обратная связь
Щелкните по всплывающему окну обратной связи, чтобы начать давать обратную связь об этом инструменте
Связанные инструменты
Откройте больше инструментов, которые могут быть полезны для вашего рабочего процесса