uuid例:18efca2d-6e25-42bf-a636-30b8f9f2de09
代碼生成方案(引自文章:面試官問(wèn):能否模擬實(shí)現(xiàn)JS的call和apply方法)
let random
let uuid = ''
for (let i = 0; i < 32; i++) {
random = Math.random() * 16 | 0; // 解釋1
if (i === 8 || i === 12 || i === 16 || i === 20) { // 解釋2
uuid += '-';
}
uuid += (i === 12 ? 4 : (i === 16 ? (random & 3 | 8) : random)).toString(16); // 解釋3
}
return uuid;
解釋?zhuān)?/p>
-
random = Math.random() * 16 | 0
是為了去除隨機(jī)數(shù)生成的小數(shù)雕旨,因?yàn)槲贿\(yùn)算只對(duì)整數(shù)有效扮匠,遇到小數(shù)時(shí),會(huì)將小數(shù)部分舍去凡涩,只保留整數(shù)部分 - uuid第8棒搜、12、16活箕、20位都是連字符
-
- uuid格式
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
- 數(shù)字 M的四位表示 UUID 版本力麸,當(dāng)前規(guī)范有5個(gè)版本,M可選值為1, 2, 3, 4, 5
- 代碼中
i === 12 ? 4 : xxx
育韩,需要生成的M為4克蚂,因?yàn)榈谒膫€(gè)版本是根據(jù)隨機(jī)數(shù)生成 - 數(shù)字 N的一至四個(gè)最高有效位表示 UUID 變體( variant ),有固定的兩位10xx因此只可能取值8, 9, a, b
- 代碼中
i === 16 ? (random & 3 | 8) : xxx
這里是為了保證數(shù)字N有固定的兩位10xx筋讨,首先random & 3
埃叭,3的二進(jìn)制為0011,與操作符&
將random
前兩位置0悉罕,后兩位不變赤屋,然后random & 3 | 8
,9的二進(jìn)制為1000壁袄,或操作符|
將random
最高位置1类早,這樣一通操作可以保證random
前兩位為10后兩位不變 - 因?yàn)閡uid每一位都是十六進(jìn)制數(shù),因此我們通過(guò)
toString(16)
傳參將每一位進(jìn)行十六進(jìn)制轉(zhuǎn)化嗜逻。