UUID 是通用唯一识别码(Universally Unique Identifier)的缩写,它是一个 128 位的数字,用于在计算机系统中识别信息。UUID 的目的是让分布式系统中的所有元素都能生成不冲突的 ID,而无需中央协调。这意味着即使两台不同的机器或两个不同的进程生成 UUID,它们也几乎可以肯定不会相同。
UUID 的作用主要体现在以下几个方面:
- 唯一标识: UUID 的主要目的是为对象提供唯一的标识符。这在数据库、分布式系统和需要唯一标识资源的任何其他场景中都非常有用。
- 去中心化生成: UUID 可以在不依赖中央授权机构的情况下生成,这意味着即使在离线环境下也可以创建唯一的 ID。
- 全局唯一性: UUID 的设计目标是在时空上全局唯一。虽然理论上存在碰撞的可能性,但这种可能性极低,可以忽略不计。
以下是用 JavaScript 生成 UUID 的方法(前端开发):
function generateUUID() {
let d = new Date().getTime(); // 获取当前时间戳
if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
d += performance.now(); //use high-precision timer if available
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
// 示例用法:
let uuid = generateUUID();
console.log(uuid);
这段代码的解释:
-
new Date().getTime()
和performance.now()
: 获取当前时间戳,尽可能使用更高精度的计时器以减少碰撞的可能性。performance.now()
提供比Date.getTime()
更高的精度,尤其在快速连续生成 UUID 时效果更好。 -
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
: 这是 UUID 的标准格式,其中 x 表示可以是任何十六进制数字,4 表示版本号(这里是版本 4,基于随机数生成),y 的前四位必须是 8、9、a 或 b 之一。 -
.replace(/[xy]/g, function(c) { ... })
: 这个部分遍历 UUID 模板字符串,并将 x 和 y 替换为随机生成的十六进制数字。 -
(r & 0x3 | 0x8)
: 这部分代码确保 y 的前四位符合 UUID 版本 4 的规范。
更简洁的版本 (利用 Crypto API):
现代浏览器普遍支持 crypto.randomUUID()
API,这是生成 UUID v4 的更简洁和标准化的方法:
function generateUUID() {
return crypto.randomUUID();
}
let uuid = generateUUID();
console.log(uuid);
如果你的目标浏览器支持 crypto.randomUUID()
,强烈推荐使用这个方法,因为它更简单、更高效,并且符合标准。 如果需要兼容不支持该 API 的旧版浏览器,则可以使用上面第一个代码示例。