生成随机uuid Javascript
我正在尝试构建一个函数来生成一个随机uuid,我在堆栈上发现了一些东西,我需要了解一点该函数如何使用typescript创建它:生成随机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
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
之间的值的函数。(0包括-1不包括)[例如:0.36342115]1
- 将该值乘以16,结果介于
和0
之间。(0包括-16不包括)[例如:5.8147384]16
- 通过使用带零的按位OR运算符(
),我们基本上可以将结果降到最低,因为数字被转换为整数。(0包括-15包括)[例如:5] 在不涉及太多逻辑操作细节的情况下,按位或为零表示不改变任何位。然而,由于按位操作处理32位整数,因此结果是强制转换的,因此被分解为整数。在没有太多性能开销的情况下,我们可以使用专用的楼层功能来替换此操作,以提高可读性。()|0
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; }
var v=r&0x3 | 0x8
):
- 我们知道
的值为r
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14或15
- 通过使用带有
的按位AND运算符和带有0x3
的按位OR运算符,结果(0x8
)的值将为8,9,10,11v
- 旁注:这种情况永远不会发生在方法中,因为被替换的字符串只包含
值x
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);
});
}