全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。

GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中的 x 是 0-9 或 a-f 范围内的一个32位十六进制数。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。

GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。

UUID有四个版本:

UUID Version 1:基于时间的UUID

基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。但由于时间因素的顺序为时间低位在前,高位在后,不适合做主键,可以组合。

UUID Version 3:基于名字的UUID(MD5)

基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。

UUID Version 4:随机UUID

根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。

UUID Version 5:基于名字的UUID(SHA1)

和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

由上面的版本可知,在浏览器里的JS下基本上无法使用版本1,2,3,5,所以只能使用方法四来模拟生成UUID。

算法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

1

2

3

4

5

6

function guid() {

    function S4() {

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

    }

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

}

算法4

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

}

这个可以指定长度和基数。比如

1

2

3

4

5

6

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

PS:以上模拟的实现方式仅供特定的环境下使用和真实的UUID生成机制不一样,大家有好的实现方式可以讨论。

JS生成 UUID的四种方法相关推荐

  1. JavaScript生成uuid的四种方法

    在开发过程中,有时候需要js生成全局唯一标识符,在java中可以使用uuid,但是JS中没有现成的函数.总结了一下,JS生成唯一标识符的几种方法. 第一种 function guid() {retur ...

  2. js 生成UUID的几种方法

    简介: UUID(Universally Unique IDentifier) 全局唯一标识符. UUID是一种由算法生成的二进制长度为128位的数字标识符.UUID 的格式为"xxxxxx ...

  3. 前端面试题:使用css生成田字格的四种方法

    使用css生成田字格的四种方法 html结构 css基础样式 第一种 flex布局 第二种 绝对定位 第三种 css瀑布流 第四种 float浮动 html结构 <div class=" ...

  4. js数组去重的四种方法

    四种算法来实现这个目的: Array.prototype.unique1 = function () {var n = []; //一个新的临时数组for (var i = 0; i < thi ...

  5. JS获取随机数的四种方法(转)

    原帖:https://www.jb51.net/article/82747.htm JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random()  这个函数可以生成 ...

  6. Js声明数组的四种方法

    //第一种 var A=[12,78,78,78,89] console.log(A)//第二种 var B=new Array(); B[0]=12 B[1]=34 B[2]=56 console. ...

  7. JS类型判断的四种方法以及各自的注意点

    基本类型:String.Number.Boolean.Symbol.Undefined.Null 引用类型:Object (引用类型除 Object 外,还包括 Function .Array.Reg ...

  8. js 判断数据类型的四种方法

    1,typeof typeof 返回的数据类型有 undefined boolean (true,false) string symbol number function object 注意  typ ...

  9. js创建数组的四种方法【2021.11.13】

    参考书籍<JavaScript百炼成仙> 1.直接量定义数组: var arr = [1,2,3]; 2.采用构造函数的方法创建数组对象: var a =new Array(); 3.也是 ...

最新文章

  1. 2013年,移动App设计的13大精髓
  2. CFileDialog 打开多个目录下的多个文件
  3. Quick Cocos2dx 调试问题
  4. 【深度学习】深度学习手写代码汇总(建议收藏,面试用)
  5. Kanboard简单的可视化任务板,项目管理
  6. 结对编程:黄金分割游戏
  7. docker 清理容器的一些命令,彻底或选择清理
  8. 大一上期c语言实验报告2,大一上期C语言实验报告1熟悉实验环境
  9. FineUIPro控件库深度解析
  10. 2019-08-21
  11. Windows PE/COFF
  12. swiper 插件里面嵌套可滚动内容
  13. 回乡偶记|从这个四省交界的苏北大城, 看二三线城市区块链现状
  14. NX/UG二次开发孔特征查找
  15. 第三方网站不能调用微信公众平台里的图片了 显示此图片来自微信公众号平台未经允许不可引用...
  16. 教育部中央电教馆—家庭教育指导师证书
  17. Cisco RV320未经身份验证的配置导出
  18. 探索未知领域,是我犯错了么?
  19. 自媒体人必备神器,200w+自媒体人都在用
  20. 超级详细树讲解三 —— B树、B+树图解+代码

热门文章

  1. SQL 增加或删除一列
  2. [渝粤教育] 天水师范学院 移动通信与无线网络 参考 资料
  3. Jfinal-Controller层注入Service空指针异常
  4. 禁止vite打包时将rgba转为16进制
  5. 【操作系统】实验六 系统内存使用统计
  6. python实验过程心得体会_web实训心得体会
  7. php 图片相似度对比算法,php比较图片相似度代码示例
  8. 2021年R1快开门式压力容器操作考试题库及R1快开门式压力容器操作考试APP
  9. 小程序微信小程序设计登录页面
  10. Java输出各种 * 图案