Skip to content

在JavaScript中生成UUID

通用唯一标识符(UUID)是一个128位的数字,用于在互联网上唯一标识某个对象或实体。它已经被RFC 4122标准化。

由于浏览器和Node.js在其API上历史上存在一些差异,当生成UUID时,您应该了解运行时环境。让我们深入了解您的选项以及何时使用它们。

[!IMPORTANT]

以下所有实现,据我所知,都符合RFC4122第4版。

最新的浏览器和Node.js版本

在现代浏览器或Node.js中生成UUID非常简单。由于Crypto API已经标准化,您可以使用crypto.randomUUID()方法生成UUID。

```js [浏览器] crypto.randomUUID(); // '7982fcfe-5721-4632-bede-6000885be57d'


```js [Node.js]
import { randomUUID } from 'crypto';

randomUUID(); // '7982fcfe-5721-4632-bede-6000885be57d'

旧的环境

在旧的环境中,生成UUID是一个更复杂的任务。虽然随着时间的推移,下面描述的技术将变得不那么相关,但我认为仍然值得记录。

[!NOTE]

这种技术对于浏览器和Node.js是相同的。然而,在Node.js版本v17.4.0之前,你需要使用crypto.randomBytes()而不是crypto.getRandomValues()

如果crypto.randomUUID()不可用,crypto.getRandomValues()仍然可用。这个方法允许你生成加密强度的伪随机数据。它接受一个TypedArray作为参数,并用随机值填充它。

首先创建一个表示UUID 模板的字符串:([1e7] + -1e3 + -4e3 + -8e3 + -1e11)。这个字符串包含了将被随机十六进制数字替换的占位符(数字018)。

然后,使用String.prototype.replace(),用我们使用crypto.getRandomValues()生成的随机十六进制数字替换占位符。对于每个匹配的占位符,使用按位异或运算符(^)和右移>>)操作,右移c / 4的结果(其中c是占位符)。这将得到一个随机的十六进制数字。最后,使用Number.prototype.toString()并使用基数16将值转换为十六进制字符串。

const generateUUID = () =>
  ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
    (
      c ^
      (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))
    ).toString(16)
  );

generateUUID(); // '7982fcfe-5721-4632-bede-6000885be57d'