需要此功能的详细说明
Detailed explanation for this function needed
我正在研究一个函数,其主要目的是为应用程序的每个用户生成一个唯一的 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 以 2 为基数是 110
。 (110)&(11)
提取最低位,因此结果是 (10)
以 2 为基数,转换为以 10 为基数的 2。因此分配了 2。如果 r&0x3
的值为 0,|0x8
部分使其回落到 0x8
,即 8。要了解更多信息,请阅读 bitwise operators
综上所述,原字符串xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
中的'x'和'y'是一个占位符,它会生成某种随机id如b9e08d48-0dfc-4a27-ba77-4a94b363b311
,通过用随机字符替换它们。
到 2013 年,此函数开始出现在 Whosebug 上(例如 here)。如果您搜索关键字 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
,您可以在 Whosebug 上轻松找到 20 次提及。
并且试图进一步追溯,我能找到的最早提及是在 2011 年的 github 上,当时有人试图找到一个更短的函数。 (即 here)。事实上,他提供的最后一个解决方案似乎更短,也可能更快。尽管如此,您引用的版本是最受欢迎的版本。
为避免进一步复制,您可能希望将其替换为外部库。
npm install uuid
并将该代码替换为
import { v4 as uuidv4 } from 'uuid';
uuidv4();
如解释的那样here。
我正在研究一个函数,其主要目的是为应用程序的每个用户生成一个唯一的 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 以 2 为基数是 110
。 (110)&(11)
提取最低位,因此结果是 (10)
以 2 为基数,转换为以 10 为基数的 2。因此分配了 2。如果 r&0x3
的值为 0,|0x8
部分使其回落到 0x8
,即 8。要了解更多信息,请阅读 bitwise operators
综上所述,原字符串xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
中的'x'和'y'是一个占位符,它会生成某种随机id如b9e08d48-0dfc-4a27-ba77-4a94b363b311
,通过用随机字符替换它们。
到 2013 年,此函数开始出现在 Whosebug 上(例如 here)。如果您搜索关键字 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
,您可以在 Whosebug 上轻松找到 20 次提及。
并且试图进一步追溯,我能找到的最早提及是在 2011 年的 github 上,当时有人试图找到一个更短的函数。 (即 here)。事实上,他提供的最后一个解决方案似乎更短,也可能更快。尽管如此,您引用的版本是最受欢迎的版本。
为避免进一步复制,您可能希望将其替换为外部库。
npm install uuid
并将该代码替换为
import { v4 as uuidv4 } from 'uuid';
uuidv4();
如解释的那样here。