ai /nanoid

A tiny (118 bytes), secure, URL-friendly, unique string ID generator for JavaScript

★ 27,130⑂ 895
JavaScriptCreated 2017-08-05zelark.github.io/nano-id-cc/
27,130
stars
+10+12+35
895
forks
–
watchers
–
prs
–
issues
–
releases
–
discussions

README

Nano ID



English | 日本語 | Русский | 简体中文 | Bahasa Indonesia | 한국어 | العربية

一个小巧、安全、URL友好、唯一的 JavaScript 字符串ID生成器。

 “一个惊人的无意义的完美主义水平,这简直让人无法不敬佩。”

- 小巧. 117字节 (经过压缩和Brotli处理)。没有依赖。[Size Limit] 控制大小。
- 快速. 比原生 crypto.randomUUID() 更快。
- 安全. 它使用硬件随机生成器。可在集群中使用。
- 紧凑. 它使用比 UUID(A-Za-z0-9_-)更大的字母表。因此,ID 大小从36个符号减少到21个符号。
- 可移植. Nano ID 已被移植到 20种编程语言。

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


支持现代浏览器、IE [需使用 Babel]、Node.js 和 React Native。

[Size Limit]: https://github.com/ai/size-limit

---

  Nano ID 由 Evil Martians 开发,我们是一家美国的设计与工程咨询公司,专注于开发者工具、AI 和网络安全领域的初创公司。

---

 目录

- 目录
- 与 UUID 的比较
- 基准值
- 安全性
- 安装
- API
  - 自定义字母或大小
  - 自定义随机字节生成器
  - 不安全
- 用法
  - React
  - React Native
  - PouchDB and CouchDB
  - CLI
  - TypeScript
  - 其他编程语言
- 工具

 与 UUID 的比较

Nano ID 与 UUID v4 (基于随机数) 相当。
它们在 ID 中有相似数量的随机位
(Nano ID 为126,UUID 为122),因此它们的碰撞概率相似::

 要想有十亿分之一的重复机会,
 必须产生103万亿个版本4的ID.

Nano ID 和 UUID v4之间有两个主要区别:

1. Nano ID 使用更大的字母表,所以类似数量的随机位
   被包装在21个符号中,而不是36个。
2. Nano ID 比 crypto.randomUUID 和 uuid/v4 更快。

 基准值

rust
$ node ./test/benchmark.js
nope-id                 50,866,431 ops/sec
nanoid                  25,580,859 ops/sec
customAlphabet           3,955,574 ops/sec
crypto.randomUUID        6,583,303 ops/sec
uuid v4                  5,575,055 ops/sec
@napi-rs/uuid            8,369,981 ops/sec
uid/secure               7,965,602 ops/sec
@lukeed/uuid             6,301,692 ops/sec
nanoid for browser         626,943 ops/sec
secure-random-string       509,515 ops/sec
uid-safe.sync              491,164 ops/sec

Non-secure:
uid                     34,793,413 ops/sec
nanoid/non-secure        2,717,308 ops/sec
rndm                     2,779,850 ops/sec


 安全性

_请看一篇关于随机生成器理论的好文章:
[安全的随机值 (在 Node.js 中)]_

- 不可预测性. 不使用不安全的 Math.random(), Nano ID
  使用 Node.js 的 crypto 模块和浏览器的 Web Crypto API。
  这些模块使用不可预测的硬件随机生成器。
- 统一性. random % alphabet 是编写ID生成器时常犯的一个错误。
  这样做会导致分布不均匀; 一些符号出现的机会较其他符号低。因此,在暴力破解时,尝试的次数会减少。
  Nano ID 使用了一种 [更好的算法],并进行了一致性测试。

  

- 有据可查: 所有的 Nano ID 的行为都有记录。
  见 [源代码] 中的注释。
- 漏洞: 报告安全漏洞,请使用
  安全联系人 Tidelift.
  Tidelift 将协调修复和披露。

[安全的随机值 (在 Node.js 中)]: https://gist.github.com/joepie91/7105003c3b26e65efcea63f3db82dfba
[更好的算法]: https://github.com/ai/nanoid/blob/main/index.js
[源代码]: https://github.com/ai/nanoid/blob/main/index.js

 安装

bash
npm install nanoid


想要快速上手尝试,你可以从 CDN 加载 Nano ID。但是,它不建议
在生产中使用,因为它的加载性能较低。

js
import { nanoid } from 'https://cdn.jsdelivr.net/npm/nanoid/nanoid.js'


 API

默认情况下,Nano ID 使用 URL 友好的符号(A-Za-z0-9_-)并返回一个
有21个字符(类似 UUID v4 的碰撞概率)的 ID。

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


如果你想要减小 ID 大小(但是会增加碰撞概率),
可以将大小作为参数传递

js
nanoid(10) //= "IRFa-VaY2b"


别忘了在我们的 [ID 碰撞概率] 计算器中检查你的 ID 大小的安全性。

您也可以使用 自定义字母表
或者是 自定义生成器.

[ID 碰撞概率]: https://zelark.github.io/nano-id-cc/

 自定义字母或大小

customAlphabet 返回一个函数,允许您使用自定义字母表和ID大小创建 nanoid。

js
import { customAlphabet } from 'nanoid'
const nanoid = customAlphabet('1234567890abcdef', 10)
model.id = 

Snapshot: 2026-11-10T09:35:25Z · Data license Apache-2.0 · JSON