求助,这段生成uuid的函数没怎么理解

发布于 2022-09-12 22:44:31 字数 457 浏览 10 评论 0

生成uuid的函数没懂

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);
    });
}

这个为什么能将小数转换成整数

var r = Math.random()*16|0

这个是什么意思

r&0x3|0x8

这行怎么理解?

v = c == 'x' ? r : (r&0x3|0x8);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

绿光 2022-09-19 22:44:31

这并不是真的 UUID,只能说是个符合 UUID 标准格式的一个随机字符串。

这里面运用了很多位运算,需要你先有一定的 2 进制和 2 进制计算的基础知识。对于计算机相关专业的学生来说,大一下或大二上时这是必修课程内容;非科班出身的人,建议先恶补相关知识。

Math.random() 会生成一个 [0, 1) 范围的随机小数,* 16 后范围即变为 [0, 16)

x | y 表示按位或运算。JS 中,位运算会先将操作数转化为 32bit 2 进制数,然后通过无符号右移、取整,最后再进行按位操作。所以一个数跟 0 做按位或操作,就等于截断小数部分取整了。

x & y 表示按位和运算(也有翻译成按位与的,一个意思)。

0x30x8 在 JS 中表示 16 进制数,这里这两个数就相当于 10 进制的 38;同理例如 0xf 等于 10 进制的 15

x ? y : z 是三目运算符,即 x 是 Truly 时返回 y、否则返回 z

number.toString(16) 表示将一个 Number 对象转换为 16 进制字符串。

宫墨修音 2022-09-19 22:44:31

其他的,然后去远足
已经说的很好,我再说一下

v = c == 'x' ? r : (r&0x3|0x8);

这句其实限制了'y'转换出的数据是0x8,0x9,0xA,0xB这几种可能,估计是想做一个特殊的标记位。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文