热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用JavaScript生成Java兼容的UUID代码实现与优化技巧

本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。

一、UUID是什么

UUID就是Universal Unique IDentifier的缩写,它是一个128位,16字节的值,并确保在时间和空间上唯一。

它是把硬件地址、时间以及随机数结合在一起,它保证对在同一时空中的所有机器都是唯一的。

通常平台会提供生成UUID的API。UUID按照开放软件基金会 (OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID (Globals Unique Identifiers)。

一般情况下,生成算法用计算机网卡的地址和一个60位的timestamp生成,时间是以100ns为时间间隔。

例如,一台300PL 6862的计算机,主板集成的网卡的MAC地址为00-04-AC-2E-B7-DC,而UUID的最后六个字节也会是0004AC2EB7DC

一般我们都知道使用Java如何创建UUID,如下:

java类:java.util.UUID

UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID

import java.util.UUID;

public class TestGUID {

public static void main(String[] args) {//用main方法是为了测试方便

UUID uuid = UUID.randomUUID(); //实际项目中只有这句有用

System.out.println (uuid);

}

}

编译运行输出如:c9d6294f-0c62-453f-8626-68c7b0fc9769

二、JS生成UUID

如果想在js中使用uuid我们可以使用如下方法生成:

/*!

Math.uuid.js (v1.4)

http://www.broofa.com

mailto:robert@broofa.com

Copyright (c) 2010 Robert Kieffer

Dual licensed under the MIT and GPL licenses.

*/

/*

* Generate a random uuid.

*

* USAGE: Math.uuid(length, radix)

* length - the desired number of characters

* radix - the number of allowable values for each character.

*

* EXAMPLES:

* // No arguments - returns RFC4122, version 4 ID

* >>> Math.uuid()

* "92329D39-6F5C-4520-ABFC-AAB64544E172"

*

* // One argument - returns ID of the specified length

* >>> Math.uuid(15) // 15 character ID (default base=62)

* "VcydxgltxrVZSTV"

*

* // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)

* >>> Math.uuid(8, 2) // 8 character ID (base=2)

* "01001010"

* >>> Math.uuid(8, 10) // 8 character ID (base=10)

* "47473046"

* >>> Math.uuid(8, 16) // 8 character ID (base=16)

* "098F4D35"

*/

(function() {

// Private array of chars to use

var CHARS = &#39;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&#39;.split(&#39;&#39;);

Math.uuid = function (len, radix) {

var chars = CHARS, uuid = [], i;

radix = radix || chars.length;

if (len) {

// Compact form

for (i = 0; i

} else {

// rfc4122, version 4 form

var r;

// rfc4122 requires these characters

uuid[8] = uuid[13] = uuid[18] = uuid[23] = &#39;-&#39;;

uuid[14] = &#39;4&#39;;

// Fill in random data. At i==19 set the high bits of clock sequence as

// per rfc4122, sec. 4.1.5

for (i = 0; i <36; i++) {

if (!uuid[i]) {

r = 0 | Math.random()*16;

uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];

}

}

}

return uuid.join(&#39;&#39;);

};

// A more performant, but slightly bulkier, RFC4122v4 solution. We boost performance

// by minimizing calls to random()

Math.uuidFast = function() {

var chars = CHARS, uuid = new Array(36), rnd=0, r;

for (var i = 0; i <36; i++) {

if (i==8 || i==13 || i==18 || i==23) {

uuid[i] = &#39;-&#39;;

} else if (i==14) {

uuid[i] = &#39;4&#39;;

} else {

if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;

r = rnd & 0xf;

rnd = rnd >> 4;

uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];

}

}

return uuid.join(&#39;&#39;);

};

// A more compact, but less performant, RFC4122v4 solution:

Math.uuidCompact = function() {

return &#39;xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx&#39;.replace(/[xy]/g, function(c) {

var r = Math.random()*16|0, v = c == &#39;x&#39; ? r : (r&0x3|0x8);

return v.toString(16);

});

};

})();

三、JS中生成Guid

全局唯一标识符,简称GUID(发音为 /ˈɡuːɪd/或/ˈɡwɪd/),是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个128位长的二进制整数。GUID一词有时也专指微软对UUID标准的实现。

GUID的主要目的是产生完全唯一的数字。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID的总数也足够大,达到了2128(3.4×1038)个,所以随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。

下面是生成Guid代码实现,优点是代码量极少:

// Generate four random hex digits.

function S4() {

return (((1+Math.random())*0x10000)|0).toString(16).substring(1);

};

// Generate a pseudo-GUID by concatenating random hexadecimal.

function guid() {

return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());

};

下面是几种生成Guid的算法来自(http://www.cnblogs.com/snandy/p/3261754.html)

1、

function uuid() {

var s = [];

var hexDigits = "0123456789abcdef";

for (var i = 0; i <36; i++) {

s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);

}

s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010

s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01

s[8] = s[13] = s[18] = s[23] = "-";

var uuid = s.join("");

return uuid;

}

2.

function guid() {

return &#39;xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx&#39;.replace(/[xy]/g, function(c) {

var r = Math.random()*16|0, v = c == &#39;x&#39; ? r : (r&0x3|0x8);

return v.toString(16);

});

}

3、

这个可以指定长度和基数:



推荐阅读
  • 深入解析 Unity URP/SRP 渲染管线:匠心打造的全面指南
    本文深入探讨了Unity中的URP、SRP和HDRP渲染管线,详细解析了它们之间的关系及各自的特点。首先介绍了SRP的基本概念及其在Unity渲染架构中的作用,随后重点阐述了URP和HDRP的设计理念与应用场景。文章还分析了SRP诞生的背景,解释了为何Unity需要引入这一灵活的渲染框架,以满足不同项目的需求。通过对比URP和HDRP,读者可以更好地理解如何选择合适的渲染管线,以优化项目的性能和视觉效果。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 本文探讨了基于点集估算图像区域的Alpha形状算法在Python中的应用。通过改进传统的Delaunay三角剖分方法,该算法能够生成更加灵活和精确的形状轮廓,避免了单纯使用Delaunay三角剖分时可能出现的过大三角形问题。这种“模糊Delaunay三角剖分”技术不仅提高了形状的准确性,还增强了对复杂图像区域的适应能力。 ... [详细]
  • 在Unity中进行3D建模的全面指南,详细介绍了市场上三种主要的3D建模工具:Blender 3D、Maya和3ds Max。每种工具的特点、优势及其在Unity开发中的应用将被深入探讨,帮助开发者选择最适合自己的建模软件。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 探讨两种常数卷积的结果与一种常见的洗牌算法错误及其影响
    在编程中,随机打乱数组元素的顺序(即“洗牌”)是一个常见的需求。标准的洗牌算法是Fisher-Yates shuffle,但许多开发者在实现时容易犯错,导致结果不均匀。本文探讨了两种常数卷积的结果,并分析了一种常见的洗牌算法错误及其对随机性的影响。通过详细的实验和理论分析,我们揭示了这些错误的具体表现和潜在危害,为开发者提供改进的建议。 ... [详细]
  • 本文探讨了使用JavaScript实现多种经典排序算法的高效方法,包括冒泡排序、选择排序、插入排序、归并排序和快速排序。为了确保代码的结构清晰和可维护性,我们首先定义了一个 `ArrayList` 类,该类中包含了待排序的数组声明。通过这种方式,我们不仅能够更好地组织代码,还能提高算法的执行效率和可读性。此外,我们还对每种排序算法进行了详细的性能分析和优化建议,以帮助开发者在实际应用中选择最合适的排序方法。 ... [详细]
  • 第11章详细探讨了DOM扩展,其中W3C将一些已经广泛采用的专有扩展标准化并纳入规范。本章重点介绍了两个主要的DOM扩展:Selectors API(选择符API)和HTML5选择符API。这些扩展不仅增强了DOM操作的灵活性和效率,还为开发者提供了更强大的选择器支持,使得复杂的选择和操作变得更加简便。此外,本章还讨论了这些API在实际开发中的应用案例和最佳实践。 ... [详细]
  • ATL(ActiveTEmplateLibrary)活动模板库RPC(RemoteProcedureCallProtocol)远程过程调用协议DCE(DistributedComp ... [详细]
author-avatar
丹丹6655
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有