2017-08-13 76 views
0

我试图编写一个包含小写/大写字母,数字和符号的8个字符的JavaScript GUID生成器。我找到了这些解决方案,但需要解释每个解决方案的情况。最初我以为我需要一个字符串来存放所有的字母/数字/符号,这些字母/数字/符号可以用随机数函数索引来建立一个新的GUID,但是这些解决方案似乎都是凭空创造出数字/字母/符号。Javascript GUID(全局唯一标识符)生成器说明

在解决方案1中,“1+”和“0x10000”的用途是什么? “.toString(16)”和“.substring(1)”的用途是什么?它是如何通过这一小段代码生成数字/符号/ AND字母的?

解决方案1:

function guid() { 
    function s4() { 
    return Math.floor((1 + Math.random()) * 0x10000) 
     .toString(16) 
     .substring(1); 
    } 
    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + 
    s4() + '-' + s4() + s4() + s4(); 
} 

在溶液2中,我看到的GUID如何为32个字符长,但不明白为什么的Math.random被乘以特异性 “16”,用一个toString(16 )附加,但这次没有“.substring(x)”?

解决方案2:

function generateGuid() { 
    var result, i, j; 
    result = ''; 
    for(j=0; j<32; j++) { 
    if(j == 8 || j == 12|| j == 16|| j == 20) 
     result = result + '-'; 
    i = Math.floor(Math.random()*16).toString(16).toUpperCase(); 
    result = result + i; 
    } 
    return result; 
} 

无需解释GUID的结构,也不是什么连字符是XD

任何及所有详细的说明表示赞赏!

+0

[Number.prototype.toString](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString) – Pointy

+1

不确定是否重要,但这不是一个GUID ..这只是伪随机字符序列 – Slai

回答

1

在第二种情况下,Math.random()会生成一个位于0(包含)到1(不包含)之间的数字。
现在如果我想要一个应该是< 16的数字,将16与[0,1)中的值相乘应该为我完成这项工作,toString(16)将它转换为基数为16的数字。我们添加32个这样的数字整体

的第一示例生成2.0之间的数(1.0,]并用(10^4)乘以它对于底座16现在我们已经在范围(10000,20000]基数的数字16

采取的最后4位数字应该能满足我们,以便我们采取相关子出来的。
既然如此,我认为

Math.floor((Math.random()) * 0x10000) 
    .toString(16) 

也就够该解决方案,因为我们需要一个4位数字六