UUID(Universally Unique Identifier,通用唯一标识符)是一个128位的标识符,用于在分布式系统中唯一地标识信息。Python通过uuid模块提供了UUID的生成和处理功能。
UUID基本概念 #
UUID有5个版本,每个版本使用不同的生成方法:
- 版本1 - 基于时间戳和MAC地址
- 版本2 - 基于DCE安全(不常用)
- 版本3 - 基于MD5哈希和命名空间
- 版本4 - 基于随机数
- 版本5 - 基于SHA-1哈希和命名空间
Python uuid模块使用 #
导入模块 #
import uuid生成UUID #
版本1 UUID(基于时间戳和MAC地址) #
uuid1 = uuid.uuid1()
print(uuid1) # 例如: 6ba7b810-9dad-11d1-80b4-00c04fd430c8版本4 UUID(随机生成) #
uuid4 = uuid.uuid4()
print(uuid4) # 例如: 110ec58a-a0f2-4ac4-8393-c866d813b8d1版本3和5 UUID(基于命名空间和名称) #
# 版本3 - 使用MD5哈希
uuid3 = uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com')
print(uuid3) # 例如: 6fa459ea-ee8a-3ca4-894e-db77e160355e
# 版本5 - 使用SHA-1哈希
uuid5 = uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com')
print(uuid5) # 例如: 886313e1-3b8a-5372-9b90-0c9aee199e5dUUID对象属性 #
u = uuid.uuid4()
print(u.bytes) # 16字节的原始UUID
print(u.hex) # 32字符的十六进制表示
print(u.int) # 128位整数
print(u.variant) # UUID变体
print(u.version) # UUID版本号字符串与UUID转换 #
# 字符串转UUID
s = '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
u = uuid.UUID(s)
# UUID转字符串
str_uuid = str(u)实际应用场景 #
数据库主键:替代自增ID,避免暴露数据量
import sqlite3 conn = sqlite3.connect('example.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, name TEXT)''') user_id = str(uuid.uuid4()) c.execute("INSERT INTO users VALUES (?, ?)", (user_id, 'Alice')) conn.commit()文件命名:生成唯一文件名
filename = f"report_{uuid.uuid4().hex}.pdf"会话标识:Web应用中的会话ID
session_id = uuid.uuid4().hex分布式系统:跨系统的唯一标识
注意事项 #
版本选择:
- 需要可预测的标识符 → 版本3或5
- 需要完全随机的标识符 → 版本4
- 需要包含时间信息 → 版本1
安全性:
- 版本1可能泄露MAC地址和时间信息
- 版本4虽然是随机的,但Python使用的随机源可能不够安全(对安全性要求高的场景应使用
secrets模块)
性能:
- 版本4生成速度最快
- 版本1和3/5因为有计算过程,相对较慢
UUID提供了一种简单可靠的方式来生成全局唯一标识符,在分布式系统和需要唯一标识的场景中非常有用。