UUID 解释:版本、随机性、排序与安全使用
UUID 解释:版本、随机性、排序与安全使用
解释 UUID 各版本、v4、v5、v7 的差异,以及 UUID 在应用设计中适合和不适合的场景。
原创流程图
UUID 解释:版本、随机性、排序与安全使用
理解原理
检查后再进入下一步
检查边界
检查后再进入下一步
使用工具
检查后再进入下一步
常见 UUID 字符串由 32 个十六进制字符和连字符组成。连字符只是格式,底层值是 128 位。部分位表示版本和变体,剩余位根据版本承载随机、时间或哈希派生数据。空间巨大,所以强随机源下碰撞概率极低。
v4 基本由随机数组成,易理解,适合测试记录、请求 ID、临时对象和无需协调的分布式创建。弱点是排序:数据库索引收到随机值会跳跃写入。普通应用通常没问题,但写入量巨大时要考虑影响。
v3 和 v5 在相同 namespace 与 name 下总会生成同一个 UUID。v3 使用 MD5,v5 使用 SHA-1。它们适合稳定映射,例如把产品 SKU、域名、文件路径或外部键映射为可重复 ID。代价是可预测性。
v7 把时间戳信息和随机位结合,让新 ID 通常排在旧 ID 后面。它适合日志、事件表和需要插入顺序的数据库。时间部分有运维价值,也可能暴露创建时间,公开 URL 中使用时应考虑。
整数序列紧凑且天然有序,但需要中央协调,也可能暴露记录数量。UUID 无需协调,适合合并多系统数据,但更大、索引缓存友好性较差。时间有序 UUID 能缓解部分索引跳跃。
UUID 是标识符,不自动等于会话秘密、重置 token、API key 或能力 URL。随机 v4 难猜,但安全 token 还需要熵、过期、撤销、存储、日志纪律和授权检查。能命名行,不代表能授权访问。
需要简单随机 ID 用 v4;需要从 namespace 和稳定名称生成可重复 ID 用 v5;需要按时间排序、方便日志或数据库写入时考虑 v7。避免把 v1 暴露给公众,尤其在硬件或时间隐私有顾虑时。
常见问题
理论上会,但强随机源和普通应用规模下概率极低。
不是。v7 适合时间排序有价值的场景,v4 在不需要排序时更简单。
通常可以,但不能把 UUID 当授权。服务端仍需要正常权限检查。
UUID 可在入库前生成,适合离线客户端、分布式导入和多来源合并,也不直接暴露记录数。
只有部分版本带时间信息。v7 可按时间排序,v4 是随机的。需要时间就显式存时间戳。