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 个变量,即r和v。我们可以轻松地将其分成两行。
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]0和 之间16。(0 包括 - 16 不包括)[例如:5.8147384]| 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);):
var (variableName) = (condition) ? (valueIfConditionIsTrue) : (valueIfConditionIsFalse);
Run Code Online (Sandbox Code Playgroud)
这可以用一个简单的if/else-statement.
var v = "";
if (c === 'x') {
v = r;
}
else {
v = r & 0x3 | 0x8;
}
Run Code Online (Sandbox Code Playgroud)
变量定义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。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)
| 归档时间: |
|
| 查看次数: |
26593 次 |
| 最近记录: |