生成随机uuid Javascript

生成随机uuid Javascript,javascript,math,random,uuid,Javascript,Math,Random,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

我正在尝试构建一个函数来生成一个随机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);
    });
  }
这在es6中写得好吗?您能否帮助理解这一行是如何工作的:


*var r=Math.random()*16 | 0,v=c='x'?r:(r&0x3 | 0x8)*

它只是用随机的[0123456789abcdef]十六进制字符替换
'xxxx-xxxx-xxx-xxxx'
中的每个
'x'
。比uuid实际需要做的多一点。我通常会:

Math.random().toString().replace("0.", "")

确实,您的方法生成了或多或少的随机字符串,可以用作uuid。然而,它的可读性非常差,以换取非常短的代码。此外,它不符合UUID的RFC标准。有关函数的更新解决方案,请查看:有关UUID的更多详细信息:

不过,让我们特别关注您要求的产品线,让我试着一步一步地解释

var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
此行定义了两个变量,即
r
v
。我们可以很容易地把它分成两行

var r = Math.random() * 16 | 0;
var v = c == 'x' ? r : (r & 0x3 | 0x8);
变量定义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位整数,因此结果是强制转换的,因此被分解为整数。在没有太多性能开销的情况下,我们可以使用专用的楼层功能来替换此操作,以提高可读性。()
除无符号右移>>>之外的所有按位操作都适用于 有符号32位整数。因此,使用按位操作将转换 浮点数为整数

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

  • 在这里,三元运算符用于保持所需代码的简短,以使赋值简短。
    var (variableName) = (condition) ? (valueIfConditionIsTrue) : (valueIfConditionIsFalse);
    
    这可以用一个简单的
    if/else语句重写。
    
    var v = "";
    if (c === 'x') { 
        v = r;
    }
    else {
        v = 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或15
  • 通过使用带有
    0x3
    的按位AND运算符和带有
    0x8
    的按位OR运算符,结果(
    v
    )的值将为8,9,10,11
  • 旁注:这种情况永远不会发生在方法中,因为被替换的字符串只包含
    x
有关按位操作的更多信息,请查看:

tldr:只需给我一个方法,在typescript中返回UUID

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

用于完成:您的方法,简化并用typescript编写

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

我在那行没有看到es6语法。逗号运算符用于变量声明、三元和按位内容。用随机十六进制字符替换字符串中的每个“x”有点过于复杂
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)  
    );
}
generateUniqSerial(): string {  
    return 'xxxx-xxxx-xxx-xxxx'.replace(/[x]/g, (c) => {  
        const r = Math.floor(Math.random() * 16);  
        return r.toString(16);  
  });  
}