JS生成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我们可以使用如下方法生成:

<span style="font-size:18px;">/*! 
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 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');  
   
  Math.uuid = function (len, radix) {  
    var chars = CHARS, uuid = [], i;  
    radix = radix || chars.length;  
   
    if (len) {  
      // Compact form  
      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];  
    } else {  
      // rfc4122, version 4 form  
      var r;  
   
      // rfc4122 requires these characters  
      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';  
      uuid[14] = '4';  
   
      // 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('');  
  };  
   
  // 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] = '-';  
      } else if (i==14) {  
        uuid[i] = '4';  
      } 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('');  
  };  
   
  // A more compact, but less performant, RFC4122v4 solution:  
  Math.uuidCompact = function() {  
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {  
      var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);  
      return v.toString(16);  
    });  
  };  
})();</span>  

三、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 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {  
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);  
        return v.toString(16);  
    });  
}  

3、

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

// 8 character ID (base=2)

uuid(8, 2)  //  "01001010"

// 8 character ID (base=10)

uuid(8, 10) // "47473046"

// 8 character ID (base=16)

uuid(8, 16) // "098F4D35"

function uuid(len, radix) {  
    var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');  
    var uuid = [], i;  
    radix = radix || chars.length;  
   
    if (len) {  
      // Compact form  
      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];  
    } else {  
      // rfc4122, version 4 form  
      var r;  
   
      // rfc4122 requires these characters  
      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';  
      uuid[14] = '4';  
   
      // 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('');  
}  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏racaljk

《代码整洁之道》摘录总结

1.     以下全部条款源于·<Clean Code Robert.C.Martin>Chapter 17,这里对其进行文字层面的加工,简化,便于以后能短时浏...

11430
来自专栏歪先生_自留地

Python test2

12030
来自专栏Java开发者杂谈

For update带来的思考

​ 之所以想写这个专题,是因为最近在做一个抢占任务的实现。假设数据库很多个任务,在抢占发生之前任务的状态都是FREE。现在假设同时有一堆抢占线程开始工作,抢占线...

14430
来自专栏开发 & 算法杂谈

基于Lockset的数据竞争检测方法汇总(一)

对于搞数据竞争检测方向的人来说,Lockset方法大家肯定不陌生,作为一个刚入门数据竞争检测方向的我来说,就和大家总结一下我近期有关Lockset方法的一些研究...

21240
来自专栏HansBug's Lab

【技巧】Java工程中的Debug信息分级输出接口及部署模式

UPDATE: 2018.4.4 笔者将考虑将这一模块封装成一个完整的java第三方包并可能进行开源放送,完成后将会再次发布最新消息,敬请期待。 -------...

42960
来自专栏Spark学习技巧

Flink DataStream编程指南及使用注意事项。

Flink中的DataStream程序是对数据流进行转换的常规程序(例如,过滤,更新状态,定义窗口,聚合)。数据流的最初的源可以从各种来源(例如,消息队列,套接...

2.4K70
来自专栏逸鹏说道

.Net中的AOP系列之构建一个汽车租赁应用(下)

相似地,我们也要在Redeem方法中添加,这里不做了,省略。问题越来越明显了,横切关注点基本上占据了这个方法的一半代码。但是我们还没有做完,我们需要讨论一下异常...

37060
来自专栏SeanCheney的专栏

Python模拟登陆 —— 征服验证码 8 微信网页版

微信登录界面 微信网页版使用了UUID含义是通用唯一识别码来保证二维码的唯一性。 先用一个伪造的appid获得uuid。 params = { ...

61490
来自专栏码洞

Shell文本处理编写单行指令的诀窍

小编编程资质一般,刚出道的时候使用的是windows来做程序开发,平时linux命令的知识仅限于在学校里玩ubuntu的时候学到的那丁点。在一次偶然看见项目的主...

8720
来自专栏码洞

Shell文本处理编写单行指令的诀窍

小编编程资质一般,刚出道的时候使用的是windows来做程序开发,平时linux命令的知识仅限于在学校里玩ubuntu的时候学到的那丁点。在一次偶然看见项目的主...

8910

扫码关注云+社区

领取腾讯云代金券