生成随机 uuid Javascript

sah*_*oun 5 javascript random math uuid

我正在尝试构建一个函数来生成随机 uuid,我在堆栈上发现了一些东西,我需要了解一点该函数如何使用 typescript 创建它:

public generateUniqSerial() {
    return 'xxxx-xxxx-xxx-xxxx'.replace(/[x]/g, function (c) {
      var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  }
Run Code Online (Sandbox Code Playgroud)

这句话用 es6 写得好吗?你能帮助理解这行代码是如何工作的吗:

var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
Run Code Online (Sandbox Code Playgroud)

小智 9

确实,您的方法会生成一个或多或少随机的字符串,可以将其用作 uuid。然而它的可读性非常差,换来的是非常短的代码。此外,它不遵守 UUIDS 的 RFC 标准。有关函数的更新解决方案,请查看: https: //stackoverflow.com/a/2117523/8524465,有关 UUIDS 的更多详细信息:https: //stackoverflow.com/a/105074/8524465

但是,让我们特别关注您请求的行,让我尝试逐步解释它。

var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
Run Code Online (Sandbox Code Playgroud)

该行定义了 2 个变量,即rv。我们可以轻松地将其分成两行。

var r = Math.random() * 16 | 0;
var v = c == 'x' ? r : (r & 0x3 | 0x8);
Run Code Online (Sandbox Code Playgroud)

变量定义1: ( r = Math.random() * 16 | 0;):

  • Math.random()0是一个返回和之间的值的函数1。(0 包括 - 1 不包括)[例如:0.36342115]
  • 该值乘以 16,结果介于0和 之间16。(0 包括 - 16 不包括)[例如:5.8147384]
  • 通过使用带有零 ( ) 的按位 OR 运算符| 0,我们基本上将结果取整,因为数字被转换为整数。(0 包括在内 - 15 包括在内)[例如:5] 在不深入讨论逻辑运算的太多细节的情况下,按位或为零意味着没有位被更改。然而,由于按位运算适用于 32 位整数,因此结果会被强制转换并因此取整为整数。在没有太多性能开销的情况下,我们可以用专用的底函数替换此操作以提高可读性。(/sf/answers/524165281/

除了无符号右移、>>> 之外的所有按位运算都适用于有符号 32 位整数。因此,使用按位运算会将浮点数转换为整数。

var r = Math.floor(Math.random() * 16);
Run Code Online (Sandbox Code Playgroud)

变量定义2 ( var v = c == 'x' ? r : (r & 0x3 | 0x8);):

变量定义2.1 ( var v = r & 0x3 | 0x8):

  • 我们知道 的r值为 或0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,or 15
  • 通过使用按位 AND 运算符0x3和按位 OR 运算符0x8,结果 ( v) 的值为 8、9、10、11。
  • 旁注:这种情况在您的方法中永远不会发生,因为替换的字符串仅包含值x

有关按位运算的更多信息,请查看: https: //www.w3schools.com/js/js_bitwise.asp

tldr:只要给我一个在 typescript 中返回 UUID 的方法即可。

使用 @broofa 的最新版本(/sf/answers/148226641/)作为基础:

uuidv4(): string {  
    // @ts-ignore  
    return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>  
        // tslint:disable-next-line:no-bitwise  
        (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)  
    );
}
Run Code Online (Sandbox Code Playgroud)

为了完成:你的方法,简化并用打字稿编写

generateUniqSerial(): string {  
    return 'xxxx-xxxx-xxx-xxxx'.replace(/[x]/g, (c) => {  
        const r = Math.floor(Math.random() * 16);  
        return r.toString(16);  
  });  
}
Run Code Online (Sandbox Code Playgroud)


Aar*_*zyk -3

它只是用随机的 [0123456789abcdef] 十六进制字符替换每个'x'in 。'xxxx-xxxx-xxx-xxxx'比你真正需要为 uuid 做的多一点。我通常这样做:

Math.random().toString().replace("0.", "")
Run Code Online (Sandbox Code Playgroud)