js生成uuid和guid

一、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

1

2

3

4

5

6

7

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

<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代码实现,优点是代码量极少:

1

2

3

4

5

6

7

8

// 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、

1

2

3

4

5

6

7

8

9

10

11

12

13

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.

1

2

3

4

5

6

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"

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值