ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于 uuid 你需要知道的一些事和应用方法

2022-07-26 13:35:17  阅读:233  来源: 互联网

标签:UUID nanoid v1 关于 https com 应用 uuid


关于 uuid 你需要知道的一些事和应用方法

​​UUID​​​ 的全称是 ​​Universally Unique Identifier​​​,中文为​​通用唯一识别码​​。

构成:由一组​32位​数的​16进制​数字所构成。

格式:以连字号分为五段,表现形式为​8-4-4-4-12​的32个字符

​​xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx 如:30385d15-0a88-42eb-bc43-2c000e9f778c​​

  • v1基于mac地址和时间戳,可反向推导和预测,因此不推荐。
  • v3和v5能够实现相同参数产生相同的uuid,因此,在需要这种功能的场景下可以使用。
  • v4版本依赖随机数,更适合于大多数业务场景。
  • v2版本已经弃用,相比v1,它除了加入mac,还加入了标识符(GID/UID),其暴露的用户信息更多。

可以发现, 比较高的版本并不是一定更好,而是各自适合不同的应用场景。

是否永远不会重复?

使用有限的位数来表示可能无限的数据,那肯定是会复制的。那么重复的概率如何?

https://zelark.github.io/nano-id-cc/

这个工具可以可视化看到不同位数的重复概率,例如 21 位,以每小时产生 1000 个id 的情况下,17年后有 1% 的概率重复。

由于可能会重复,尽管概率很少,但总有一种不可预期的感觉。

不重复的方案?

根据 https://www.igiftidea.com/article/12183874318.html 这一文章这的这段话:

在一个前雇主,我们有一个包含随机 uuid 的独特列。我们在部署后的第一周发生了碰撞。当然,几率很低,但不是零。这就是 Log4j 2 包含 UuidUtil.getTimeBasedUuid 的原因。只要您在单个服务器上每秒生成的 UUID 不超过 10,000 个,它就会生成一个在 8,925 年内唯一的 UUID。

那么我们在 javascript 中是否存在在这样的方法呢?

经过搜索, getTimeBasedUuid 应该就是 基于时间戳的 uuid v1.

生成可排序的 uuid:

v1 虽然是基于时间戳的, 但时间戳并没有在 uuid 字符串的前面, 如果要让其可以排序, 需要做一些处理:

const uuidV1 = require('uuid/v1');

function v1UuidCompare(a, b) {
  a = a.replace(/^(.{8})-(.{4})-(.{4})/, '$3-$2-$1');
  b = b.replace(/^(.{8})-(.{4})-(.{4})/, '$3-$2-$1');
  return a < b ? -1 : (a > b ? 1 : 0);
}

> v1UuidCompare(uuidV1(), uuidV1())
-1

如何选择版本

如果程序有不同的要求,则可以选择不同的 uuid 版本。

v1 - 必须需要保证唯一性,且是在单个线程中运行。
v4 - 容错性比较好,比如友好的错误处理。
v3,v5 - 使用相同参数可重复的 uuid。

有哪些 javascript 实现可用

function broofa() {
    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);
    });
}

console.log(broofa())
/* Assuming that self.crypto.randomUUID() is available */

let uuid = self.crypto.randomUUID();
console.log(uuid); // for example "36b8f84d-df4e-4d49-b662-bcde71a8764f"
  • nanoid
    用于 JavaScript 的小型、安全、URL 友好、唯一的字符串 ID 生成器。

https://npmjs.com/package/nanoid

import { nanoid } from 'nanoid'
model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"
  • uuid
    用于创建RFC4122 UUID

https://www.npmjs.com/package/uuid

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

参考

标签:UUID,nanoid,v1,关于,https,com,应用,uuid
来源: https://www.cnblogs.com/daysme/p/16520584.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有