首页 > 其他分享 >什么是UUID?它有什么作用?用js写一个生成UUID的方法

什么是UUID?它有什么作用?用js写一个生成UUID的方法

时间:2024-12-03 09:25:20浏览次数:4  
标签:function now UUID 什么 生成 performance js uuid

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

这段代码的解释:

  1. new Date().getTime()performance.now(): 获取当前时间戳,尽可能使用更高精度的计时器以减少碰撞的可能性。 performance.now() 提供比 Date.getTime() 更高的精度,尤其在快速连续生成 UUID 时效果更好。

  2. xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx: 这是 UUID 的标准格式,其中 x 表示可以是任何十六进制数字,4 表示版本号(这里是版本 4,基于随机数生成),y 的前四位必须是 8、9、a 或 b 之一。

  3. .replace(/[xy]/g, function(c) { ... }): 这个部分遍历 UUID 模板字符串,并将 x 和 y 替换为随机生成的十六进制数字。

  4. (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 的旧版浏览器,则可以使用上面第一个代码示例。

标签:function,now,UUID,什么,生成,performance,js,uuid
From: https://www.cnblogs.com/ai888/p/18583310

相关文章

  • 长链接在http2中与http/1.1协议中有什么区别?
    在HTTP/1.1中,为了克服队头阻塞问题以及提高页面加载速度,浏览器会与服务器建立多个TCP连接,并行地下载资源。然而,过多的连接也会带来新的问题,例如连接建立的开销、资源竞争等。在HTTP/2中,引入了多路复用的概念,它允许在单个TCP连接上并发地传输多个请求和响应。这意味着浏览......
  • iframe可以使用父页面中的资源吗(如:css、js等)?
    是的,iframe可以使用父页面中的资源,例如CSS和JavaScript。这取决于iframe的src属性以及父页面和iframe页面之间的关系。以下几种情况:同源策略下的iframe:如果iframe的src指向与父页面同源的URL(协议、域名和端口都相同),那么iframe可以完全访问父页面的资源,包括CSS、JavaScript......
  • 在页面中引入静态资源文件,为什么静态资源文件改变后,再次发起请求还是之前的内容,没有变
    前端开发中,静态资源文件修改后页面未更新,通常是由于浏览器缓存机制导致的。浏览器为了提高加载速度,会将静态资源(例如图片、CSS、JavaScript文件等)缓存到本地。下次访问相同资源时,浏览器会优先使用缓存版本,而不是重新下载。以下是一些解决方法:强制浏览器刷新:Ctrl+Shift+......
  • 切换标签窗口后js定时器自动停止了,如何在激活标签后又继续呢?
    JavaScript定时器在标签页失去焦点(例如切换到其他标签页或最小化浏览器)时,会被浏览器降低优先级或暂停,以节省资源。这会导致定时器不准确,甚至看起来停止了。要解决这个问题,你需要使用requestAnimationFrame或手动调整时间差。1.使用requestAnimationFrame(推荐)requestAnim......
  • js如何解决数字精度丢失的问题?
    JavaScript使用IEEE754标准的双精度浮点数来表示数字,这会导致在处理某些十进制数时出现精度丢失的问题。例如,0.1+0.2的结果不是0.3,而是0.30000000000000004。以下是一些解决JavaScript数字精度丢失问题的常用方法:1.使用整数进行计算:如果可能,尽量使用整数进行计算,......
  • 为什么说css中能用子代选择器的时候不要用后代选择器?
    在CSS中,提倡尽可能使用子代选择器(>)而不是后代选择器(空格),主要是因为性能和可预测性方面的原因:性能更高:子代选择器只选择直接子元素,而后代选择器会选择所有后代元素,包括子元素、孙元素等等。这意味着使用后代选择器时,浏览器需要遍历更多的DOM节点来确定匹配的元素,尤其在......
  • 宝塔Linux面板的系统要求是什么?
    宝塔Linux面板对系统环境有明确的要求,以确保其稳定运行和最佳性能。以下是详细的系统要求:内存要求:最低要求:至少512MB以上,推荐768MB以上。纯面板运行大约占用系统60MB内存。更高的内存配置可以确保面板和网站的流畅运行,尤其是在处理多个任务或高流量网站时。硬盘空间要求:......
  • 为什么宝塔面板默认开启了HTTPS加密访问?
    宝塔面板默认开启了HTTPS加密访问,主要是为了提升安全性和保护用户的隐私。以下是几个主要原因:数据加密:原因:HTTPS协议使用SSL/TLS加密技术,可以确保数据在传输过程中不被窃取或篡改。这特别重要,因为宝塔面板涉及许多敏感操作,如管理网站、数据库和文件等。好处:通过加密数据,可以......
  • 为什么宝塔面板要求使用干净的操作系统?
    宝塔面板要求使用干净的操作系统,主要是为了避免与其他已安装的环境(如Apache、Nginx、PHP、MySQL、PostgreSQL、GitLab、Java等)发生冲突。以下是具体的原因:避免冲突:原因:宝塔面板在安装过程中会自动配置和安装一系列服务和组件,如Web服务器(Nginx/Apache)、数据库(MySQL/PostgreSQL......
  • 如果我在宝塔面板中修改了面板端口或FTP端口,需要注意什么?
    如果你在宝塔面板中修改了面板端口或FTP端口,需要注意以下几点:更新安全组规则:面板端口:如果你修改了宝塔面板的默认端口(例如从8888改为8889),需要在阿里云安全组中放行新的端口。FTP端口:如果你修改了FTP端口(例如从21改为2121),需要在阿里云安全组中放行新的FTP端口,并且如果使用FTP......