为了账号安全,请及时绑定邮箱和手机立即绑定

生成uuid的方法为啥先&0x3后|0x8???

生成uuid的方法为啥先&0x3后|0x8???

富国沪深 2019-03-14 14:15:09
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);    });}代码如上,为啥先&0x3后|0x8???
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

//上面的代码等效为下面的

function guid() {

    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {

        var r = Math.random()*16|0;//这里其实还有一个作用就是把r变成了整数

        var v = (c == 'x') ? r : (r&0x3|0x8);// 其实就是说x直接替换,y另外的用经过特殊处理的,这里的特殊处理就是 r&0x3|0x8 ,因为位运算有顺序,这样的值就限定在一个范围了,其范围就是二进制 1000-1011这样4个数字了,然后输出为8,9,A,B这样4个字符了。

        return v.toString(16);

    });

}

这样处理可能是用于校验、检测等等目的。


查看完整回答
反对 回复 2019-03-22
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

个人感觉,它其实是想保证返回的值是[8,A]这个区间的。


r

------

& 0011

------

| 1010


查看完整回答
反对 回复 2019-03-22
  • 2 回答
  • 0 关注
  • 1688 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信