Генератор уникальных идентификаторов 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, и используйте кнопку "Копировать", чтобы скопировать его в буфер обмена для удобного использования в ваших приложениях.
Связанные инструменты
Откройте больше инструментов, которые могут быть полезны для вашего рабочего процесса