uuid
什么是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上有中文文档。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据