CUID 生成器 - 生成抗冲突的唯一标识符工具
为分布式系统、数据库和网络应用程序生成抗冲突的唯一标识符(CUID)。该工具创建的 CUID 可扩展、可排序,并且极不可能发生冲突。
CUID 生成器
快速轻松地生成抗冲突的 ID。
CUID 结构
时间戳:
随机:
文档
CUID 生成器
介绍
CUID(碰撞抵抗唯一标识符)是一种旨在抵抗碰撞、水平可扩展且可按顺序排序的唯一标识符。CUID 在分布式系统中特别有用,因为需要在节点之间没有协调的情况下生成唯一标识符。
CUID 的结构
CUID 通常由以下组件组成:
- 时间戳:当前时间的表示
- 计数器:确保在同一毫秒内唯一的顺序计数器
- 客户端指纹:生成 CUID 的机器或进程的唯一标识符
- 随机组件:额外的随机数据,以进一步降低碰撞概率
确切的结构可能因 CUID 实现而异,但这些组件共同作用以创建唯一且可排序的标识符。
以下是典型 CUID 结构的可视化表示:
CUID 的生成方式
CUID 是通过时间和随机组件的组合生成的。该过程通常包括:
- 获取当前时间戳
- 递增计数器(周期性重置)
- 生成客户端指纹(通常在每个会话或应用程序启动时完成)
- 添加随机数据
- 以特定格式组合这些元素
生成的 CUID 通常表示为字母和数字的字符串。
优势和用例
CUID 相较于其他唯一标识符系统具有几个优势:
- 碰撞抵抗:时间戳、计数器和随机数据的组合使得碰撞极不可能,即使在分布式系统中。
- 水平可扩展性:CUID 可以在多个机器上独立生成,而无需协调。
- 顺序排序:时间戳组件允许对 CUID 进行按时间顺序的排序。
- URL 友好:CUID 通常由 URL 安全字符组成。
CUID 的常见用例包括:
- 数据库主键
- 需要在多个节点之间生成唯一 ID 的分布式系统
- Web 应用程序中的会话 ID
- 分析系统中的事件跟踪
- 云存储系统中的文件或资源命名
代码示例
以下是在各种编程语言中生成 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' gem)
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 最初由 Eric Elliott 于 2012 年开发,作为在分布式系统中生成唯一标识符的解决方案。该概念受到 Twitter 的 Snowflake ID 系统的启发,但设计得更易于实现和在各种平台上使用。
CUID 的开发是由于需要一个简单、抗碰撞的 ID 系统,能够在不同的编程语言和环境中工作。Elliott 的目标是创建一个易于实现、不需要中央协调且可以水平扩展的系统。
自问世以来,CUID 经过了几次迭代和改进:
- 原始 CUID 实现专注于简单性和易用性。
- 随着采用的增加,社区为各种编程语言贡献了实现。
- 2021 年,CUID2 被引入,以解决原始 CUID 的一些局限性,并提供更好的性能和抗碰撞能力。
- CUID2 改进了原始版本,使用了更安全的随机数生成器,并增加了标识符的整体长度。
CUID 的演变反映了分布式系统不断变化的需求,以及在唯一标识符生成中平衡简单性、安全性和性能的持续努力。
参考文献
- 官方 CUID GitHub 仓库
- CUID2 规范
- Elliott, Eric. "在分布式环境中生成唯一 ID。" Medium, 2015.
- "分布式系统的抗碰撞 ID。" DZone, 2018.
这个 CUID 生成器工具允许您快速为您的项目生成 CUID。只需单击“生成”按钮即可创建新的 CUID,然后使用“复制”按钮将其复制到剪贴板,以便在您的应用程序中轻松使用。
反馈
点击反馈提示开始给这个工具反馈