什么是uuid

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。

uuid是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的

说白了就是生成唯一标识符的作用,那么它的重复几率就一定要极低。

每秒产生10亿笔UUID,100年后只产生一次重复的机率是50%。如果地球上每个人都各有6亿笔UUID,发生一次重复的机率是50%

所以我们在日常使用中,可以不用考虑重复性的问题,几率非常非常小。

uuid会生成一个32位16进制的数字,目前有5个版本。

  • uuid.v1 使用主机 MAC 地址和当前日期和时间的组合生成的
  • uuid.v2 基本与v1相同,是一个优化版,很多时候这个版本没有被实现
  • uuid.v3 基于命名空间、name和输入值的Md5处理
  • uuid.v4 使用随机或者伪随机数来生成,目前常用的一个版本
  • uuid.v5 和v3的想法相同,也是利用命名空间这些来生成

guid又是什么

guid是 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。是微软对于uuid的标准实现。

uuid可以看成是最底层的标准,guid是具体的实现,事实上会有一些第三方库,名字也叫uuid,这也是具体的实现,所以很让人搞混两者之间的关系。

前端生成uuid

uuid库

github:uuid

npm install uuid
const { v4: uuidv4 } = require('uuid');
uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'

Crypto

Crypto是node的一个模块,目的是提供通用的加密和哈希算法,由于js的实现导致速度非常慢,node利用c/c++实现这些算法,然后通过该模块暴露为我们使用的js接口。

const crypto = require('crypto');
const uuid = crypto.randomUUID(); 

console.log(uuid); // ⇨ "36b8f84d-df4e-4d49-b662-bcde71a8764f"

利用浏览器的URL对象

function uuid() {
  var temp_url = URL.createObjectURL(new Blob());
  var uuid = temp_url.toString(); // blob:https://xxx.com/b250d159-e1b6-4a87-9002-885d90033be3
  URL.revokeObjectURL(temp_url);
  return uuid.substr(uuid.lastIndexOf("/") + 1);
}

这种方式相对于引入一个第三方库文件来说,会更加方便,如果没有每秒产生上万次的需求,这种方式的性能几乎没啥损耗。

竞品:NanoID

NanoID也是一个创建唯一key的方式,小了uuid七岁,但是github上的start数量已经比uuid还多了。

github:NanoID

它相对uuid,包更小,速度快60%,更加安全和易用。

npm i nanoid
import { nanoid } from 'nanoid'
model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"

支持现代浏览器,ie使用的话需要babel转一下,由于是一个不依赖其他库的加密,所以在node.js这种纯js环境,也是可以使用的。

有兴趣可以去了解一下,github上有中文文档。

分类: 前端功能 标签: uuid唯一值nanoid

评论

暂无评论数据

暂无评论数据

目录