js通过时间戳以及随机数生成uuid

2024-01-09 11:56:17

一. 简介

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有五个版本,每个版本有不同的生成方法:

  1. 版本1(基于时间的UUID):结合当前时间戳、机器的MAC地址以及一些随机或伪随机的序列来生成UUID,确保在时间和空间上的唯一性。
  2. 版本2(DCE安全的UUID):与版本1相似,但增加了POSIX UID/GID等和特定于DCE的信息来生成UUID。
  3. 版本3(基于名字的UUID,使用MD5散列):通过散列命名空间和名字生成UUID,它使用MD5散列算法。
  4. 版本4(随机UUID):使用随机数或伪随机数生成UUID。这个版本不依赖于机器的硬件特征,因此无法保证其在时间和空间的唯一性,但实际中,因其极高的随机性,使得碰撞的可能性非常低。
  5. 版本5(基于名字的UUID,使用SHA-1散列):在UUID版本3的基础上,用SHA-1散列算法代替MD5,生成方式和版本3一样。
    每个UUID版本都有特定的使用场景,但在实际应用中,版本1的时间基和版本4的随机数基UUID是最常用的。版本3和版本5在需要通过名字生成一致而唯一的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的变体相区分。

三.应用场景

  1. 分布式系统:在分布式系统中,可以通过UUID生成独一无二的标识,避免数据标识的冲突。
  2. 数据库的主键:在数据库中,使用UUID作为记录的主键可以保证在合并或是多数据库之间同步时的唯一性。
  3. 文件命名:为了避免文件命名冲突,特别是在网络共享环境中,可以使用UUID生成唯一的文件名。
  4. 网络协议:某些协议需要唯一的操作标识,例如在一些版本的RPC(远程过程调用)中,就会用到UUID。
  5. 软件组件的标识:在大型软件系统中,为了保证组件的唯一性,开发者也会使用UUID。

四.优缺点

1.优点:

  1. 全局唯一性:UUID 的设计能够保证全球范围内的唯一性,这在分布式系统中尤其有价值。
  2. 易生成:UUID 可以在没有中央管理机构的情况下生成,简化了系统的设计和实施。
  3. 匿名性:UUID 不包含关于生成它的计算机的信息,维护了用户和数据的匿名性。

2.缺点:

  1. 大小和空间利用:UUID 的存储大小为128位,显著大于传统的32位或64位整数主键,对存储空间和索引效率有一定影响。
  2. 可读性差:由于其复杂的结构,UUID 对于人类来说很难识别和记忆。
  3. 性能问题:在一些数据库中,使用UUID作为主键索引的效率可能低于传统的自增主键,尤其是在排序和插入操作时。

综合来看,UUID 在需要确保唯一性或在分布式系统下管理标识时非常有用,但在考虑高性能数据库操作时,可能需要评估其带来的潜在性能影响。

五.代码示例

1.代码:

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);

2.解析:

这个 generateUUID 函数的目的是生成一个符合 UUID (Universally Unique Identifier) 版本 4 (随机) 标准的字符串。

UUID 是一种用于生成唯一的标识符的算法,广泛用于计算机系统。UUID 的版本 4 是基于随机数或伪随机数生成的,保证每次生成的值都是独一无二的。

下面是 generateUUID 函数的详细步骤解释:

首先,函数内部创建一个 timestamp 变量,并通过 new Date().getTime() 获取当前时间的时间戳(以毫秒为单位的数字)。

接下来,定义了一个字符串 uuid,它包含了一个用于生成 UUID 的模板,其中 x 和 y 是占位符,随后会被替换为具体的数值。

函数中使用 replace 方法对字符串进行处理,它采用一个正则表达式匹配所有的 x 和 y 字符,然后使用一个回调函数来替换匹配到的每个字符。

回调函数中,首先计算一个随机数 r。这个随机数是通过取当前时间戳加上一个 015 的随机数然后模 16 得到的,确保 r 在 015(十六进制的 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 的设计就是让这种冲突的可能性非常非常低。

文章来源:https://blog.csdn.net/qq_45096273/article/details/135474432
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。