我正在通过一个函数,其主要目的是为应用程序的每个用户生成唯一的ID
guid: function() {
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);
});
},
我需要在 replace(/[xy]/g)
{即这意味着什么}上的解释,而 (r&0x3|0x8)
的含义是什么。
/[xy]/g
是RegEx
字面。String.prototype.replace(..)
将RegEx
或子字符串作为其第一个参数,而新的子字符串或函数作为其第二个。
/[xy]/g
是一个正则表达式,与原始字符串中的单个字符 x
或 y
匹配。
replace(..)
将使用给定功能替换所有与正则('x'或y'(相匹配的子字符串。
该函数基本上给出了replace(..)
的随机字符,以替换'x'或y',并且对'y'进行其他&
操作(它仍然给出随机字符,但有一个不同的字符(。
如果是'y',则分配了(r&0x3|0x8)
。
在(r&0x3|0x8)
中,r
是前面生成的随机数。0x3在二进制中为11(基数2(。r&0x3
提取r
的最低两个位。例如,如果r
(随机数(为6。6中的6个为110
。(110)&(11)
提取最低位,因此结果是基本2中的(10)
,该基数在基础10中转换为2。因此分配了2。如果r&0x3
的值为0,则|0x8
零件使其落回到0x8
,即8岁。要了解有关此信息的更多信息,请在钻头操作员上阅读
总而言之,原始字符串xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
中的" x"one_answers" y"是占位符,它通过用随机字符替换它们来生成某种随机ID,例如b9e08d48-0dfc-4a27-ba77-4a94b363b311
。
到2013年,此功能开始在stackoverflow上弹出(例如,此处(。如果您搜索关键字'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
,您可以轻松地在stackoverflow上找到20个提及。
试图进一步追踪它,我最早发现的是在2011年的Github上,当时有人试验以找到较短的功能。(即在这里(。实际上,他提供的最后一个解决方案似乎也更短,也可能更快。尽管如此,您引用的版本是最受欢迎的版本。
要避免进一步复制,您可能需要用外部库替换。
npm install uuid
并用
替换该代码import { v4 as uuidv4 } from 'uuid';
uuidv4();
如下所述。