天天看點

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

>

(

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(

''

);