UUID çæå¨
å¿«éçæç¬¦å RFC 4122 æ åç UUID v4 å¯ä¸æ è¯ç¬¦
çæ UUID
使ç¨è¯´æ
UUIDï¼Universally Unique Identifierï¼æ¯ç¨äºå¨åå¸å¼ç³»ç»ä¸å¯ä¸æ è¯ä¿¡æ¯ç128使 è¯ç¬¦ãæ¬å·¥å ·åºäº RFC 4122 æ åå®ç°ï¼çæçæ¯ UUID v4 çæ¬ï¼ä½¿ç¨éæºæ°çæï¼ç¡®ä¿å ¨å±å¯ä¸æ§ã
主è¦åè½
- å个çæï¼ç¹å»"çæå个 UUID"æé®ï¼ç«å³çæä¸ä¸ªç¬¦åæ åç UUID
- æ¹éçæï¼æ¯æä¸æ¬¡çææå¤100个 UUIDï¼é忹鿵è¯åå¼ååºæ¯
- ä¸é®å¤å¶ï¼ç¹å»çæç UUID æå¤å¶æé®ï¼å¿«éå¤å¶å°åªè´´æ¿
- æ ¼å¼éªè¯ï¼ææçæç UUID é½ç»è¿æ ¼å¼éªè¯ï¼ç¡®ä¿ç¬¦åæ å
ä½¿ç¨æ¥éª¤
- æå¼é¡µé¢åï¼ç³»ç»ä¼èªå¨çæç¬¬ä¸ä¸ª UUID
- å¦éçææ°ç UUIDï¼ç¹å»"çæå个 UUID"æé®
- ç¹å» UUID 弿"å¤å¶"æé®ï¼å° UUID å¤å¶å°åªè´´æ¿
- å¦éæ¹éçæï¼ç¹å»"æ¹éçæ"æé®ï¼è¾å ¥æ°éåçæ
- æ¹éçæçç»æå¯ä»¥å ¨é¨å¤å¶æä¸è½½ä¸ºææ¬æä»¶
éç¨åºæ¯
- æ°æ®åºä¸»é®ï¼ä½ä¸ºæ°æ®åºè¡¨ç主é®ï¼é¿å èªå¢IDçå±éæ§
- åå¸å¼ç³»ç»ï¼å¨å¾®æå¡æ¶æä¸çæå¯ä¸æ è¯ç¬¦ï¼æ éä¸å¤®åè°
- API å¼åï¼ä¸º RESTful API çèµæºçæå¯ä¸æ è¯ç¬¦
- æä»¶å½åï¼ä¸ºä¸ä¼ çæä»¶çæå¯ä¸æä»¶åï¼é¿å å²çª
- ä¼è¯ç®¡çï¼çæä¼è¯IDã令ççå¯ä¸æ è¯
- æµè¯æ°æ®ï¼å¨å¼ååæµè¯ä¸å¿«éçææµè¯ç¨çå¯ä¸æ è¯ç¬¦
ææ¯åç
UUID çæ¬è¯´æ
UUID æå¤ä¸ªçæ¬ï¼æ¬å·¥å ·çæçæ¯ UUID v4ï¼éæºUUIDï¼ï¼
| çæ¬ | 说æ | ç¹ç¹ |
|---|---|---|
| UUID v1 | åºäºæ¶é´æ³åMACå°å | å 嫿¶é´ä¿¡æ¯ï¼å¯è½æ³é²MACå°å |
| UUID v2 | DCEå®å ¨çæ¬ | åºäºv1ï¼æ·»å äºæ¬å°åæ è¯ç¬¦ |
| UUID v3 | åºäºMD5åå¸ | éè¦å½å空é´ååç§°ï¼ç¡®å®æ§çæ |
| UUID v4 | éæºçæ | å®å ¨éæºï¼æå¸¸ç¨ï¼æ¬å·¥å ·ä½¿ç¨æ¤çæ¬ |
| UUID v5 | åºäºSHA-1åå¸ | éè¦å½å空é´ååç§°ï¼ç¡®å®æ§çæ |
UUID v4 æ ¼å¼
UUID v4 çæ ¼å¼ä¸ºï¼xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
- æ»é¿åº¦ï¼36个å符ï¼32个åå è¿å¶æ°å + 4个è¿å符ï¼
- 第13ä½ï¼åºå®ä¸º '4'ï¼è¡¨ç¤ºçæ¬å·
- 第17ä½ï¼åºå®ä¸º '8'ã'9'ã'a' æ 'b' ä¹ä¸ï¼è¡¨ç¤ºåä½
- å ¶ä»ä½ï¼éæºçæçåå è¿å¶æ°åï¼0-9, a-fï¼
çæç®æ³
æ¬å·¥å ·ä½¿ç¨æµè§å¨å ç½®çå å¯å®å ¨éæºæ°çæå¨ï¼Crypto APIï¼çæ UUIDï¼
- çæ16ä¸ªéæºåèï¼128ä½ï¼
- å°ç¬¬6个åèçé«4ä½è®¾ç½®ä¸º4ï¼çæ¬å·ï¼
- å°ç¬¬8个åèçé«2ä½è®¾ç½®ä¸º10ï¼å使 è¯ï¼
- å°128使°æ®è½¬æ¢ä¸ºåå è¿å¶å符串
- æç §æ åæ ¼å¼æå ¥è¿å符
å¯ä¸æ§ä¿è¯
UUID v4 çå¯ä¸æ§åºäºä»¥ä¸åçï¼
- éæºæ§ï¼ä½¿ç¨å å¯å®å ¨çéæºæ°çæå¨ï¼ç¡®ä¿éæºæ§
- 空é´å¤§å°ï¼128ä½ç©ºé´æä¾ 2^128 ç§å¯è½ç»åï¼çº¦ 3.4Ã10^38ï¼
- ç¢°ææ¦çï¼å¨çæ 2.71Ã10^18 个 UUID æ¶ï¼ç¢°ææ¦ç约为 50%
- å®é åºç¨ï¼å¨å®é åºç¨ä¸ï¼ç¢°ææ¦çæä½ï¼å¯ä»¥å¿½ç¥ä¸è®¡
代ç 示ä¾
JavaScript / Node.js
// ä½¿ç¨ crypto API çæ UUID v4
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
// 使ç¨ç¤ºä¾
const uuid = generateUUID();
console.log(uuid); // è¾åº: ä¾å¦ "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789"
// Node.js ä¸ä½¿ç¨ crypto 模åï¼æ´å®å
¨ï¼
const crypto = require('crypto');
function generateSecureUUID() {
return crypto.randomUUID();
}
Python
import uuid
# çæ UUID v4
uuid_value = uuid.uuid4()
print(uuid_value) # è¾åº: ä¾å¦ "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789"
# 转æ¢ä¸ºå符串
uuid_str = str(uuid_value)
# 卿°æ®åºä¸ä½¿ç¨ï¼SQLAlchemy示ä¾ï¼
from sqlalchemy import Column, String
import uuid
class User(Base):
__tablename__ = 'users'
id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
Java
import java.util.UUID;
// çæ UUID v4
UUID uuid = UUID.randomUUID();
String uuidString = uuid.toString();
System.out.println(uuidString); // è¾åº: ä¾å¦ "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789"
// å¨ Spring Boot ä¸ä½¿ç¨
@Entity
public class User {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id;
}
PHP
// PHP 7.1+ ä½¿ç¨ ramsey/uuid åº
use Ramsey\Uuid\Uuid;
$uuid = Uuid::uuid4();
echo $uuid->toString(); // è¾åº: ä¾å¦ "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789"
// å¨ Laravel ä¸ä½¿ç¨
use Illuminate\Support\Str;
$uuid = (string) Str::uuid();
Go
import (
"fmt"
"github.com/google/uuid"
)
// çæ UUID v4
uuidValue, err := uuid.NewRandom()
if err != nil {
panic(err)
}
fmt.Println(uuidValue.String()) // è¾åº: ä¾å¦ "a1b2c3d4-e5f6-4789-a012-b3c4d5e6f789"
SQL æ°æ®åº
-- MySQL 8.0+
CREATE TABLE users (
id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
name VARCHAR(100)
);
-- PostgreSQL
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100)
);
-- SQL Server
CREATE TABLE users (
id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
name NVARCHAR(100)
);
æä½³å®è·µ
使¶ä½¿ç¨ UUID
- åå¸å¼ç³»ç»ï¼å¤ä¸ªæå¡éè¦ç¬ç«çæå¯ä¸IDï¼æ éä¸å¤®åè°
- æ°æ®åå¹¶ï¼éè¦åå¹¶æ¥èªä¸åæ°æ®åºçæ°æ®ï¼é¿å IDå²çª
- å®å ¨æ§ï¼ä¸å¸ææ´é²åºåä¿¡æ¯ï¼é¿å è¢«çæµåæä¸¾
- 离线çæï¼å®¢æ·ç«¯éè¦ç¦»çº¿çæå¯ä¸æ è¯ç¬¦
使¶ä¸ä½¿ç¨ UUID
- æ§è½ææï¼UUID æ¯èªå¢IDå ç¨æ´å¤åå¨ç©ºé´ï¼36åè vs 4-8åèï¼
- ç´¢å¼æ§è½ï¼UUID ä½ä¸ºä¸»é®æ¶ï¼ç´¢å¼æ§è½å¯è½ä¸å¦æ´æ°ID
- 顺åºéæ±ï¼éè¦æçææ¶é´æåºçåºæ¯ï¼èªå¢IDæ´åé
- ç®ååºç¨ï¼åæºåºç¨ä¸ä¸éè¦åå¸å¼å¯ä¸æ§æ¶ï¼èªå¢IDæ´ç®å
æ°æ®åºä½¿ç¨å»ºè®®
- åå¨ç±»åï¼ä½¿ç¨ CHAR(36) æ VARCHAR(36) åå¨åç¬¦ä¸²æ ¼å¼ï¼æä½¿ç¨ä¸é¨ç UUID ç±»å
- ç´¢å¼çç¥ï¼UUID ä½ä¸ºä¸»é®æ¶ï¼èèä½¿ç¨æåº UUIDï¼å¦ UUID v1ï¼æéªè±ç®æ³
- æ§è½ä¼åï¼å¦ææ§è½æ¯å ³é®ï¼èè使ç¨äºè¿å¶æ ¼å¼åå¨ï¼16åèï¼
- æ¥è¯¢ä¼åï¼é¿å å¨ WHERE åå¥ä¸ä½¿ç¨å½æ°å¤ç UUIDï¼ä¿æç´¢å¼æç
å®å ¨æ³¨æäºé¡¹
- éæºæ§ï¼ç¡®ä¿ä½¿ç¨å å¯å®å ¨çéæºæ°çæå¨ï¼é¿å å¯é¢æµæ§
- ä¼ è¾å®å ¨ï¼å¨ URL ä¸ä½¿ç¨ UUID æ¶ï¼æ³¨æä¸è¦æ³é²ææä¿¡æ¯
- éªè¯è¾å ¥ï¼æ¥æ¶ UUID æ¶ï¼å§ç»éªè¯æ ¼å¼ï¼é²æ¢æ³¨å ¥æ»å»
- éç§ä¿æ¤ï¼UUID v1 å å« MAC å°åä¿¡æ¯ï¼ä¸éåå¨éè¦éç§çåºæ¯ä½¿ç¨
常è§é®é¢
UUID å GUID æä»ä¹åºå«ï¼
UUIDï¼Universally Unique Identifierï¼å GUIDï¼Globally Unique Identifierï¼æ¬è´¨ä¸æ¯ç¸åçæ¦å¿µãGUID æ¯å¾®è½¯å¯¹ UUID çç§°å¼ï¼ä¸¤è é½éµå¾ªç¸åçæ åï¼RFC 4122ï¼ã卿æ¯å®ç°ä¸ï¼å®ä»¬æ¯å®å ¨ç¸åçã
UUID ä¼éå¤åï¼
ç论ä¸ï¼UUID æéå¤çå¯è½æ§ï¼ä½æ¦çæä½ãUUID v4 ä½¿ç¨ 122 ä½éæºæ°ï¼æä¾çº¦ 5.3Ã10^36 ç§å¯è½ç»åãå³ä½¿æ¯ç§çæ 10 亿个 UUIDï¼ä¹éè¦çº¦ 170 亿年æä¼æä¸åçæ¦çåºç°ä¸æ¬¡ç¢°æãå¨å®é åºç¨ä¸ï¼å¯ä»¥è®¤ä¸º UUID æ¯å¯ä¸çã
UUID å¯ä»¥ä½ä¸ºæ°æ®åºä¸»é®åï¼
å¯ä»¥ï¼ä½éè¦æ³¨ææ§è½å½±åãUUID ä½ä¸ºä¸»é®çä¼ç¹æ¯ä¸éè¦ä¸å¤®åè°ãéååå¸å¼ç³»ç»ãä¸ä¼æ³é²åºåä¿¡æ¯ãç¼ºç¹æ¯å ç¨æ´å¤åå¨ç©ºé´ãç´¢å¼æ§è½å¯è½ä¸å¦æ´æ°IDãæ æ³ç´æ¥æçææ¶é´æåºãå»ºè®®æ ¹æ®å ·ä½åºæ¯éæ©ï¼åå¸å¼ç³»ç»æéè¦åå¹¶æ°æ®çåºæ¯éåä½¿ç¨ UUIDï¼åæºé«æ§è½åºç¨å¯è½æ´éåèªå¢IDã
å¦ä½éªè¯ UUID æ ¼å¼ï¼
å¯ä»¥ä½¿ç¨æ£å表达å¼éªè¯ UUID æ ¼å¼ï¼
// JavaScript
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const isValid = uuidRegex.test(uuidString);
// Python
import re
uuid_pattern = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', re.I)
is_valid = bool(uuid_pattern.match(uuid_string))
UUID å¯ä»¥ç¼©çåï¼
å¯ä»¥ï¼ä½ä¸æ¨èãUUID å¯ä»¥è½¬æ¢ä¸º Base64 æå ¶ä»ç¼ç æ ¼å¼æ¥ç¼©çé¿åº¦ï¼ä½è¿ä¼å¤±å»æ åå ¼å®¹æ§ã妿éè¦æ´ççå¯ä¸æ è¯ç¬¦ï¼å¯ä»¥èè使ç¨ï¼
- çUUIDï¼ä½¿ç¨ Base62 ç¼ç ï¼é¿åº¦çº¦ 22 å符
- NanoIDï¼æ´ççå¯ä¸IDçæåºï¼é»è®¤ 21 å符
- éªè±ç®æ³ï¼Twitter çåå¸å¼IDçæç®æ³ï¼çæ 64 使´æ°
æ¹éçæ UUID ä¼å½±åæ§è½åï¼
æ¬å·¥å ·å¨æµè§å¨æ¬å°çæ UUIDï¼ä¸ä¾èµæå¡å¨ï¼æ§è½ä¸»è¦åæµè§å¨ JavaScript 弿影åãæ¹éçæ 100 个 UUID é常å¨å 毫ç§å 宿ï¼å¯¹æ§è½å½±åå¯ä»¥å¿½ç¥ã妿éè¦çæå¤§é UUIDï¼å¦æ°ä¸ä¸ªï¼ï¼å»ºè®®å¨æå¡å¨ç«¯ä½¿ç¨ä¸é¨çåºï¼æ§è½ä¼æ´å¥½ã
çæç UUID å¯ä»¥ç¦»çº¿ä½¿ç¨åï¼
å¯ä»¥ãæ¬å·¥å ·å®å ¨å¨æµè§å¨æ¬å°è¿è¡ï¼çæç UUID ä¸ä¾èµç½ç»è¿æ¥ï¼å¯ä»¥ç¦»çº¿ä½¿ç¨ãææçæé»è¾é½å¨å®¢æ·ç«¯æ§è¡ï¼ç¡®ä¿æ°æ®éç§åå®å ¨ã