我正在经历一个函数,其主要目的是为应用程序的每个用户生成一个唯一的id,可以有人向我解释函数的工作。
replace(/[xy]/g)
我需要解释(r&0x3|0x8)
{即这意味着什么},而不是Console.WriteLine("The initial date is: ", In1.DisplayDate());
的含义。
答案 0 :(得分:3)
/[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)
提取最低位,因此结果在基数2中为(10)
,在基数10中转换为2.因此分配了2。如果r&0x3
的值为0,则|0x8
部分会使其回退到0x8
,即8。要了解详情,请阅读bitwise operators < / p>
总之,原始字符串xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
中的“x”和“y”是占位符,它会生成某种随机ID,例如b9e08d48-0dfc-4a27-ba77-4a94b363b311
,将其替换为随机字符。
答案 1 :(得分:0)
到 2013 年,这个函数开始在 stackoverflow 上出现(例如 here)。如果您搜索关键字 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
,您可以在 stackoverflow 上轻松找到 20 次提及。
并试图进一步追溯,我能找到的最早提及是在 2011 年的 github 上,当时有人尝试寻找更短的函数。 (即here)。事实上,他提供的最后一个解决方案似乎更短,也可能更快。不过,您引用的版本是最受欢迎的版本。
为避免进一步复制,您可能需要将其替换为外部库。
npm install uuid
并用
替换该代码import { v4 as uuidv4 } from 'uuid';
uuidv4();
如here所述。