写点什么

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

作者:木偶
  • 2024-05-28
    陕西
  • 本文字数:2295 字

    阅读完需:约 8 分钟

@toc

一. 简介

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。这个随机数是通过取当前时间戳加上一个 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 的设计就是让这种冲突的可能性非常非常低。
复制代码


发布于: 刚刚阅读数: 4
用户头像

木偶

关注

凭时间赢来的东西,时间肯定会为之作证 2022-10-21 加入

CSDN前端领域优质创作者,CSDN博客专家,InfoQ写作社区专家博主,擅长PC端以及Uniapp开发

评论

发布
暂无评论
js通过时间戳以及随机数生成uuid_JavaScript_木偶_InfoQ写作社区