UUID简介: UUID 的全称是 Universally Unique Identifier,即通用唯一识别码。它是一个用于计算机系统中以保证在一定范围(例如在同一台机器、同一个网络中或者在多个网络之间)的全局的唯一性标识符。标准的UUID格式由32个16进制数字组成,以连字符分为五组,形成一个36字符(32个字符和4个连字符)的字符串。例如:123e4567-e89b-12d3-a456-426614174000。
UUID的规范由开放软件基金会(Open Software Foundation, OSF)的一部分,即分布式计算环境(Distributed Computing Environment, DCE)所定义。目前的标准由RFC 4122定义,该标准描述了UUID的不同变体和版本。
UUID可以保证时间和空间的唯一性,它基于时间、机器的网络地址(例如,MAC地址)、随机数或伪随机数等元素生成。UUID有五个版本,每个版本有不同的生成方法:
UUID的标准形式包括32个16进制的数,以连字符分为5组,形式为8-4-4-4-12这样的32个字符:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx。其中’M’表示UUID版本,‘N’表示UUID变体。RFC 4122要求这些UUIDs的变体被设置为10xx(即二进制的’10’,其中x是上述的任何位),以便和其他UUIDs的变体相区分。
综合来看,UUID 在需要确保唯一性或在分布式系统下管理标识时非常有用,但在考虑高性能数据库操作时,可能需要评估其带来的潜在性能影响。
function generateUUID() {
let timestamp = new Date().getTime();
let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = (timestamp + Math.random() * 16) % 16 | 0;
timestamp = Math.floor(timestamp / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return uuid;
}
let uuids = generateUUID();
console.log(uuids);
这个 generateUUID 函数的目的是生成一个符合 UUID (Universally Unique Identifier) 版本 4 (随机) 标准的字符串。
UUID 是一种用于生成唯一的标识符的算法,广泛用于计算机系统。UUID 的版本 4 是基于随机数或伪随机数生成的,保证每次生成的值都是独一无二的。
下面是 generateUUID 函数的详细步骤解释:
首先,函数内部创建一个 timestamp 变量,并通过 new Date().getTime() 获取当前时间的时间戳(以毫秒为单位的数字)。
接下来,定义了一个字符串 uuid,它包含了一个用于生成 UUID 的模板,其中 x 和 y 是占位符,随后会被替换为具体的数值。
函数中使用 replace 方法对字符串进行处理,它采用一个正则表达式匹配所有的 x 和 y 字符,然后使用一个回调函数来替换匹配到的每个字符。
回调函数中,首先计算一个随机数 r。这个随机数是通过取当前时间戳加上一个 0 到 15 的随机数然后模 16 得到的,确保 r 在 0 到 15(十六进制的 0-F)之间。
然后时间戳被除以 16 并向下取整,这样用于下一次生成随机数 r 时,timestamp 的值会不断减小,这样可以确保 UUID 的每个部分都是随机生成的。
字符 c 等于 x 时,直接返回 r 的十六进制形式。如果是 y,则计算 (r & 0x3 | 0x8),确保返回的是 8, 9, A, 或 B,这是符合 UUID 版本 4 规范的。
将所有的占位符替换后,最终返回一个形式正确的 UUID 字符串。
在函数外部,调用 generateUUID 函数,保存生成的 UUID 到变量 uuids 中,并通过 console.log 打印出来。
每次调用这个函数都会生成一个新的、格式正确、几乎肯定是唯一的 UUID。当然,因为这是基于随机生成的,所以不能保证100%不会产生冲突,但 UUID 的设计就是让这种冲突的可能性非常非常低。