深入剖析vscode工具函数(十)uuid

什么是uuid

UUID(通用唯一标识符)是一种用于唯一标识信息的标准化方法。它是一个128位的数字,通常表示为32个十六进制数字,以连字符分隔。UUID可以用于识别文件、对象、数据库记录等。它在计算机系统中被广泛应用,尤其在分布式系统和数据库中具有重要作用。

uuid的格式

uuid的格式通常由 32 个十六进制数字和 4 个连字符组成,例如 550e8400-e29b-11d4-a716-446655440000 。

在VSCode当中,用以下的正则来检测uuid:

scss 复制代码
const _UUIDPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;

export function isUUID(value: string): boolean {
 return _UUIDPattern.test(value);
}

这个比较简单,就是8+4+4+4+12=32,[0-9a-f] 表示匹配任意一个十六进制数字或小写字母。

如何生成uuid

image

其实要生成真正的UUID还是比较困难的,如上图所示。不过好在的是,Web中已经实现了randomUUID 的方法(参见:developer.mozilla.org/en-US/docs/...

所以在兼容的情况下,优先使用:

csharp 复制代码
// use `randomUUID` if possible
if (typeof crypto === 'object' && typeof crypto.randomUUID === 'function') {
 return crypto.randomUUID.bind(crypto);
}

如果不兼容,就需要自己实现,首先需要一个能够生成随机数的函数,在Web规范里有一个高质量安全的随机数生成函数getRandomValues (参见:developer.mozilla.org/en-US/docs/... :

javascript 复制代码
// use `randomValues` if possible
let getRandomValues: (bucket: Uint8Array) => Uint8Array;
if (typeof crypto === 'object' && typeof crypto.getRandomValues === 'function') {
 getRandomValues = crypto.getRandomValues.bind(crypto);

} else {
 getRandomValues = function (bucket: Uint8Array): Uint8Array {
  for (let i = 0; i < bucket.length; i++) {
   bucket[i] = Math.floor(Math.random() * 256);
  }
  return bucket;
 };
}

注意这里的参数是一个TypedArray ,对于Uint8Array 类型来说,数组里的每一个数都是在0-255之间,因此随机化的时候区间就定为0-255。

紧接着创建一个16个大小的array:

ini 复制代码
// prep-work
const _data = new Uint8Array(16);
const _hex: string[] = [];
for (let i = 0; i < 256; i++) {
 _hex.push(i.toString(16).padStart(2, '0'));
}

注意这里大小是16,因为对于Uint8Array ,每一个元素是8位,意味着如果是16进制的话,可以转换成2个字符表示,所以要表示32位的uuid,这里数组大小是16。

这里的_hex实际上是一个映射,从0-255中映射每个数字到十六进制,不够位数的加入前导0。

最后就是真正生成uuid的函数了:

ini 复制代码
return function generateUuid(): string {
 // get data
 getRandomValues(_data);

 // set version bits
 _data[6] = (_data[6] & 0x0f) | 0x40;
 _data[8] = (_data[8] & 0x3f) | 0x80;

 // print as string
 let i = 0;
 let result = '';
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += '-';
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += '-';
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += '-';
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += '-';
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 result += _hex[_data[i++]];
 return result;
};

这里其实就是生成8位+4位+4位+4位+12位的过程,还是比较清晰的。值得注意的是,UUID 的第 7 个字节的高 4 位表示版本号,低 4 位表示变体号。版本号用于标识 UUID 的格式和含义,变体号用于标识 UUID 的生成方式和变体。

在这段代码中,_data[6] 表示 UUID 的第 7 个字节,_data[8] 表示 UUID 的第 9 个字节。首先将第 7 个字节的低 4 位清零,然后将其设置为 0100,表示这是版本 4 的 UUID。然后将第 9 个字节的高 2 位清零,然后将其设置为 10,表示这是变体 1 的 UUID。

所有UUID都遵循这个规范,如果不设置这两位,可能其他系统就无法正确地理解和解析UUID了。

小结

uuid是一种用于唯一标识信息的方法,通常由32个十六进制数字和4个连字符组成。在VSCode中,可以使用正则表达式检测uuid。要生成uuid,可以使用randomUUID方法,如果不兼容,则需要自己实现一个生成随机数的函数,并按照规定的格式生成uuid。最后,生成的uuid需要设置版本号和变体号,以确保其他系统正确解析uuid的含义。

  • END -
相关推荐
特创数字科技5 小时前
【uni-app x】告别系统相机限制!三端通用自定义相机组件:任意布局、静默拍照、录像、水印叠加、连拍回图一次搞定
前端·数码相机·uni-app
IT_陈寒5 小时前
用Vue时这个响应式陷阱坑了我一整天
前端·人工智能·后端
风骏时光牛马6 小时前
企业客户信息管理数据库
前端
paopaokaka_luck6 小时前
个人综合管理小程序(echarts数据看板、健康数据记录与趋势查看、目标拆解和进度管理、日程待办与番茄钟、习惯打卡、收支统计、个人生活记录、跨模块智能提醒)
前端·javascript·spring·小程序·数据分析·echarts·生活
霸道流氓气质6 小时前
Graph Studio Web IDE 深度实战:可视化编排、断点调试与生产级运维全指南
运维·前端·ide
福兮说14 小时前
前端下载大文件,点了按钮半天没反应:fetch + blob 的三个问题和三种替代写法
前端·javascript·性能优化·文件下载
GreenTea14 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
科技观察哨14 小时前
六足平台选型与纳米定位系统集成:HEB-640六自由度位移台在半导体光刻对准中的参数边界与国产替代评估
前端·人工智能
niucloud-admin14 小时前
JAVA V6 多商户商城 开发文档——web前端
前端