nanoid 3.1.27 → 3.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.zh-CN.md DELETED
@@ -1,510 +0,0 @@
1
- # Nano ID
2
-
3
- <img src="https://ai.github.io/nanoid/logo.svg" align="right"
4
- alt="Nano ID logo by Anton Lovchikov" width="180" height="94">
5
-
6
- [English](./README.md) | [Русский](./README.ru.md) | **简体中文**
7
-
8
- 一个小巧、安全、URL友好、唯一的 JavaScript 字符串ID生成器。
9
-
10
- > “一个惊人的无意义的完美主义水平,
11
- > 这简直让人无法不敬佩。”
12
-
13
- * **小巧.** 108 bytes (已压缩和 gzipped)。 没有依赖。
14
- [Size Limit] 控制大小。
15
- * **快速.** 它比 UUID 快 60%。
16
- * **安全.** 它使用加密的强随机 API。可在集群中使用。
17
- * **紧凑.** 它使用比 UUID(`A-Za-z0-9_-`)更大的字母表。
18
- 因此,ID 大小从36个符号减少到21个符号。
19
- * **易用.** Nano ID 已被移植到
20
- [19种编程语言](#其他编程语言)。
21
-
22
- ```js
23
- import { nanoid } from 'nanoid'
24
- model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"
25
- ```
26
-
27
- 支持现代浏览器、IE [使用 Babel]、Node.js 和 React Native。
28
-
29
- [在线工具]: https://gitpod.io/#https://github.com/ai/nanoid/
30
- [使用 Babel]: https://developer.epages.com/blog/coding/how-to-transpile-node-modules-with-babel-and-webpack-in-a-monorepo/
31
- [Size Limit]: https://github.com/ai/size-limit
32
-
33
- <a href="https://evilmartians.com/?utm_source=nanoid">
34
- <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg"
35
- alt="Sponsored by Evil Martians" width="236" height="54">
36
- </a>
37
-
38
- ## 目录
39
-
40
- * [与 UUID 的比较](#与-uuid-的比较)
41
- * [基准值](#基准值)
42
- * [安全性](#安全性)
43
- * [API](#api)
44
- * [阻塞](#阻塞)
45
- * [异步](#异步)
46
- * [不安全](#不安全)
47
- * [自定义字母或大小](#自定义字母或大小)
48
- * [自定义随机字节生成器](#自定义随机字节生成器)
49
- * [用法](#用法)
50
- * [IE](#ie)
51
- * [React](#react)
52
- * [HTML ID](#html-id)
53
- * [React Native](#react-native)
54
- * [Rollup](#rollup)
55
- * [PouchDB and CouchDB](#pouchdb-and-couchdb)
56
- * [Mongoose](#mongoose)
57
- * [Web Workers](#web-workers)
58
- * [CLI](#cli)
59
- * [其他编程语言](#other-programming-languages)
60
- * [工具](#工具)
61
-
62
-
63
- ## 与 UUID 的比较
64
-
65
- Nano ID 与 UUID v4 (基于随机) 相当。
66
- 它们在 ID 中有相似数量的随机位
67
- (Nano ID 为126,UUID 为122),因此它们的冲突概率相似::
68
-
69
- > 要想有十亿分之一的重复机会,
70
- > 必须产生103万亿个版本4的ID.
71
-
72
- Nano ID 和 UUID v4之间有三个主要区别:
73
-
74
- 1. Nano ID 使用更大的字母表,所以类似数量的随机位
75
- 被包装在21个符号中,而不是36个。
76
- 2. Nano ID 代码比 `uuid/v4` 包少 **4.5倍**:
77
- 108字节而不是483字节.
78
- 3. 由于内存分配的技巧,Nano ID 比 UUID 快 **60%**。
79
-
80
-
81
- ## 基准值
82
-
83
- ```rust
84
- $ node ./test/benchmark.js
85
- nanoid 2,280,683 ops/sec
86
- customAlphabet 1,851,117 ops/sec
87
- uuid v4 1,348,425 ops/sec
88
- uid.sync 313,306 ops/sec
89
- secure-random-string 294,161 ops/sec
90
- cuid 158,988 ops/sec
91
- shortid 37,222 ops/sec
92
-
93
- Async:
94
- async nanoid 95,500 ops/sec
95
- async customAlphabet 93,800 ops/sec
96
- async secure-random-string 90,316 ops/sec
97
- uid 85,583 ops/sec
98
-
99
- Non-secure:
100
- non-secure nanoid 2,641,654 ops/sec
101
- rndm 2,447,086 ops/sec
102
- ```
103
-
104
- 测试配置: ThinkPad X1 Carbon Gen 9, Fedora 34, Node.js 16.9.
105
-
106
-
107
- ## 安全性
108
-
109
- *请看一篇关于随机生成器理论的好文章:
110
- [安全的随机值 (在 Node.js 中)]*
111
-
112
- * **不可预测性.** 不使用不安全的 `Math.random()`, Nano ID
113
- 使用 Node.js 的 `crypto` 模块和浏览器的 Web Crypto API。
114
- 这些模块使用不可预测的硬件随机生成器。
115
- * **统一性.** `随机 % 字母表` 是编写ID生成器时常犯的一个错误。
116
- 符号的分布是不均匀的; 有些符号出现的几率会比其他符号低。因此, 它将减少刷新时的尝试次数。
117
- Nano ID 使用了一种 [更好的算法],并进行了一致性测试。
118
-
119
- <img src="img/distribution.png" alt="Nano ID uniformity"
120
- width="340" height="135">
121
-
122
- * **有据可查:** 所有的 Nano ID 的行为都有记录。
123
- 见 [源代码] 中的注释。
124
- * **漏洞:** 报告安全漏洞,请使用
125
- [安全联系人 Tidelift](https://tidelift.com/security).
126
- Tidelift 将协调修复和披露。
127
-
128
- [安全的随机值 (在 Node.js 中)]: https://gist.github.com/joepie91/7105003c3b26e65efcea63f3db82dfba
129
- [更好的算法]: https://github.com/ai/nanoid/blob/main/index.js
130
- [源代码]: https://github.com/ai/nanoid/blob/main/index.js
131
-
132
-
133
- ## 安装
134
-
135
- ```bash
136
- npm install --save nanoid
137
- ```
138
-
139
- 对于快速的骇客用法,你可以从 CDN 加载 Nano ID。但是,它不建议
140
- 在生产中使用,因为它的加载性能较低。
141
-
142
- ```js
143
- import { nanoid } from 'https://cdn.jsdelivr.net/npm/nanoid/nanoid.js'
144
- ```
145
-
146
- Nano ID提供ES模块。在 webpack、Rollup、Parcel 或 Node.js 中
147
- 你不需要做任何事情来使用 Nano ID
148
-
149
- ```js
150
- import { nanoid } from 'nanoid'
151
- ```
152
-
153
- 在 Node.js 中,你可以使用 CommonJS 导入:
154
-
155
- ```js
156
- const { nanoid } = require('nanoid')
157
- ```
158
-
159
-
160
- ## API
161
-
162
- Nano ID 有3个 API:正常(阻塞),异步,和不安全。
163
-
164
- 默认情况下,Nano ID 使用 URL 友好的符号(`A-Za-z0-9_-`)并返回一个
165
- 有21个字符(类似UUID v4的冲突概率)的ID。
166
-
167
-
168
- ### 阻塞
169
-
170
- 使用 Nano ID 最安全、最简单的方法
171
-
172
- 在极少数情况下,噪声收集时可能会阻止CPU执行其他工作
173
- 用于硬件随机发生器。
174
-
175
- ```js
176
- import { nanoid } from 'nanoid'
177
- model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"
178
- ```
179
-
180
- 如果你想要减小ID size(但是会增加冲突概率),
181
- 可以将 size 作为参数传递
182
-
183
- ```js
184
- nanoid(10) //=> "IRFa-VaY2b"
185
- ```
186
-
187
- 别忘了检查你的ID size 的安全性
188
- 在我们的 [ID 冲突概率] 计算器.
189
-
190
- 您也可以使用 [自定义字母表](#自定义字母或大小)
191
- 或者是 [自定义生成器](#自定义随机字节生成器).
192
-
193
- [ID 冲突概率]: https://alex7kom.github.io/nano-nanoid-cc/
194
-
195
-
196
- ### 异步
197
-
198
- 为了生成硬件随机字节,CPU收集电磁噪声。
199
- 在大多数情况下,熵已经被收集。
200
-
201
- 在噪声收集期间的同步API中,CPU忙且
202
- 无法执行任何有用的操作(例如,处理另一个HTTP请求)。
203
-
204
- 使用Nano ID的异步API,可以在熵收集期间
205
- 运行另一个代码。
206
-
207
- ```js
208
- import { nanoid } from 'nanoid/async'
209
-
210
- async function createUser () {
211
- user.id = await nanoid()
212
- }
213
- ```
214
-
215
- 阅读更多有关熵收集的信息 [`crypto.randomBytes`] 文档.
216
-
217
- 不幸的是,您将在浏览器中失去 Web Crypto API 的优势
218
- 如果您使用异步 API。那么,目前在浏览器中,
219
- 您将受到安全性或异步行为的限制。
220
-
221
- [`crypto.randomBytes`]: https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback
222
-
223
- ### 不安全
224
-
225
- 默认情况下,Nano ID 使用硬件随机字节生成器来实现安全性
226
- 冲突概率低。如果你不那么关心安全
227
- 更关心性能的话,您可以使用更快的非安全生成器.
228
-
229
- ```js
230
- import { nanoid } from 'nanoid/non-secure'
231
- const id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqLJ"
232
- ```
233
-
234
-
235
- ### 自定义字母或大小
236
-
237
- `customAlphabet` 允许您使用自己的字母表创建 `nanoid`
238
- 和 ID size。
239
-
240
- ```js
241
- import { customAlphabet } from 'nanoid'
242
- const nanoid = customAlphabet('1234567890abcdef', 10)
243
- model.id = nanoid() //=> "4f90d13a42"
244
- ```
245
-
246
- 在我们的中 [ID 冲突概率] 计算器检查您的自定义字母表和 ID size 的安全性。
247
- 有关更多字母表, 请在 [`nanoid-dictionary`] 查看选项.
248
-
249
- 字母表必须包含256个或更少的符号。
250
- 否则,无法保证内部生成器算法的安全性。
251
-
252
- 还提供了可定制的异步和非安全API:
253
-
254
- ```js
255
- import { customAlphabet } from 'nanoid/async'
256
- const nanoid = customAlphabet('1234567890abcdef', 10)
257
- async function createUser () {
258
- user.id = await nanoid()
259
- }
260
- ```
261
-
262
- ```js
263
- import { customAlphabet } from 'nanoid/non-secure'
264
- const nanoid = customAlphabet('1234567890abcdef', 10)
265
- user.id = nanoid()
266
- ```
267
-
268
- [`nanoid-dictionary`]: https://github.com/CyberAP/nanoid-dictionary
269
-
270
-
271
- ### 自定义随机字节生成器
272
-
273
- `customRandom` 允许您创建一个 `nanoid` 并替换字母表
274
- 和默认的随机字节生成器。
275
-
276
- 在此示例中,使用基于种子的生成器:
277
-
278
- ```js
279
- import { customRandom } from 'nanoid'
280
-
281
- const rng = seedrandom(seed)
282
- const nanoid = customRandom('abcdef', 10, size => {
283
- return (new Uint8Array(size)).map(() => 256 * rng())
284
- })
285
-
286
- nanoid() //=> "fbaefaadeb"
287
- ```
288
-
289
- `random` 回调必须接受数组大小并返回随机数的数组。
290
-
291
- 如果要使用与 `customRandom` 相同的URL友好符号,
292
- 您可以使用 `urlAlphabet` 获取默认字母表。
293
-
294
- ```js
295
- const { customRandom, urlAlphabet } = require('nanoid')
296
- const nanoid = customRandom(urlAlphabet, 10, random)
297
- ```
298
-
299
- 异步和非安全 API 不适用于 `customRandom`。
300
-
301
- ## 用法
302
-
303
-
304
- ### IE
305
-
306
- 如果你需要支持 IE, 则需要使用 Babel [转换 `node_modules`]
307
- 并添加 `crypto` 别名:
308
-
309
- ```js
310
- // polyfills.js
311
- if (!window.crypto) {
312
- window.crypto = window.msCrypto
313
- }
314
- ```
315
-
316
- ```js
317
- import './polyfills.js'
318
- import { nanoid } from 'nanoid'
319
- ```
320
-
321
- [转换 `node_modules`]: https://developer.epages.com/blog/coding/how-to-transpile-node-modules-with-babel-and-webpack-in-a-monorepo/
322
-
323
-
324
- ### React
325
-
326
- 目前还没有将 nanoid 用于 React `key` prop 的正确方法
327
- 因为它在不同的渲染中应该是一致的。
328
-
329
- ```jsx
330
- function Todos({todos}) {
331
- return (
332
- <ul>
333
- {todos.map(todo => (
334
- <li key={nanoid()}> /* 不要这样做 */
335
- {todo.text}
336
- </li>
337
- ))}
338
- </ul>
339
- )
340
- }
341
- ```
342
-
343
- 您应该尝试在列表项中找到稳定的 id。
344
-
345
- ```jsx
346
- const todoItems = todos.map((todo) =>
347
- <li key={todo.id}>
348
- {todo.text}
349
- </li>
350
- )
351
- ```
352
-
353
- 如果您没有稳定的 ID,您最好使用索引作为 `键` 而不是 `nanoid()`:
354
-
355
- ```jsx
356
- const todoItems = todos.map((text, index) =>
357
- <li key={index}> /* 仍然不推荐,但优于 nanoid()。
358
- 仅当项目没有稳定ID时才执行此操作。 */
359
- {text}
360
- </li>
361
- )
362
- ```
363
-
364
-
365
- ### HTML ID
366
-
367
- 如果你想使用 Nano ID 作为 `id` 属性,你必须设置一些字符串前缀
368
- (HTML ID 以数字开头是无效的)
369
-
370
- ```jsx
371
- <input id={'id' + this.id} type="text"/>
372
- ```
373
-
374
-
375
- ### React Native
376
-
377
- React Native 没有内置的随机生成器。下面的 polyfill
378
- 适用于普通 React Native 和从 `39.x` 开始的 Expo。
379
-
380
- 1. 检查 [`react-native-get-random-values`] 文档并安装它。
381
- 2. 在 Nano ID 之前导入它。
382
-
383
- ```js
384
- import 'react-native-get-random-values'
385
- import { nanoid } from 'nanoid'
386
- ```
387
-
388
- [`react-native-get-random-values`]: https://github.com/LinusU/react-native-get-random-values
389
-
390
-
391
- ### Rollup
392
-
393
- 对于 Rollup 来说,你需要 [`@rollup/plugin-node-resolve`] 来绑定浏览器版本。
394
- 除了这个库,还需要 [`@rollup/plugin-replace`] 来替换 `process.env.NODE_ENV`。
395
-
396
- ```js
397
- plugins: [
398
- nodeResolve({
399
- browser: true
400
- }),
401
- replace({
402
- 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
403
- })
404
- ]
405
- ```
406
-
407
- [`@rollup/plugin-node-resolve`]: https://github.com/rollup/plugins/tree/master/packages/node-resolve
408
- [`@rollup/plugin-replace`]: https://github.com/rollup/plugins/tree/master/packages/replace
409
-
410
-
411
- ### PouchDB and CouchDB
412
-
413
- 在 PouchDB 和 CouchDB 中,ID 不能以下划线 `_` 开头。
414
- 需要一个前缀来防止这个问题,因为 Nano ID 可能在默认情况下使用 `_` 作为 ID 的开头。
415
- 在默认情况下,在 ID 的开头使用 `_`。
416
-
417
- 用下面的选项覆盖默认的 ID。
418
-
419
- ```js
420
- db.put({
421
- _id: 'id' + nanoid(),
422
-
423
- })
424
- ```
425
-
426
-
427
- ### Mongoose
428
-
429
- ```js
430
- const mySchema = new Schema({
431
- _id: {
432
- type: String,
433
- default: () => nanoid()
434
- }
435
- })
436
- ```
437
-
438
-
439
- ### Web Workers
440
-
441
- Web Workers 无法访问安全的随机生成器.
442
-
443
- 当ID应该是不可预测的时候,安全性对ID很重要。
444
- 例如,在 "按 URL 访问"的链接生成中。
445
- 如果你不需要不可预测的 ID,但你需要使用 Web Workers。
446
- 你可以使用非安全的 ID 生成器。
447
-
448
- ```js
449
- import { nanoid } from 'nanoid/non-secure'
450
- nanoid() //=> "Uakgb_J5m9g-0JDMbcJqLJ"
451
- ```
452
-
453
-
454
- ### CLI
455
-
456
- 你可以通过调用 `npx nanoid` 在终端获得唯一的 ID。你只需要
457
- 在系统中安装了 Node.js。你不需要把 Nano ID 安装在任何地方。
458
-
459
- ```sh
460
- $ npx nanoid
461
- npx: installed 1 in 0.63s
462
- LZfXLFzPPR4NNrgjlWDxn
463
- ```
464
-
465
- 如果你想改变字母或 ID size,你应该使用 [`nanoid-cli`]。
466
-
467
- [`nanoid-cli`]: https://github.com/twhitbeck/nanoid-cli
468
-
469
-
470
- ### 其他编程语言
471
-
472
- Nano ID 已被移植到许多语言。 你可以使用下面这些移植,获取在客户端和服务器端相同的ID生成器。
473
-
474
- * [C#](https://github.com/codeyu/nanoid-net)
475
- * [C++](https://github.com/mcmikecreations/nanoid_cpp)
476
- * [Clojure and ClojureScript](https://github.com/zelark/nano-id)
477
- * [Crystal](https://github.com/mamantoha/nanoid.cr)
478
- * [Dart & Flutter](https://github.com/pd4d10/nanoid-dart)
479
- * [Deno](https://github.com/ianfabs/nanoid)
480
- * [Go](https://github.com/matoous/go-nanoid)
481
- * [Elixir](https://github.com/railsmechanic/nanoid)
482
- * [Haskell](https://github.com/4e6/nanoid-hs)
483
- * [Janet](https://sr.ht/~statianzo/janet-nanoid/)
484
- * [Java](https://github.com/aventrix/jnanoid)
485
- * [Nim](https://github.com/icyphox/nanoid.nim)
486
- * [Perl](https://github.com/tkzwtks/Nanoid-perl)
487
- * [PHP](https://github.com/hidehalo/nanoid-php)
488
- * [Python](https://github.com/puyuan/py-nanoid)
489
- with [dictionaries](https://pypi.org/project/nanoid-dictionary)
490
- * [Ruby](https://github.com/radeno/nanoid.rb)
491
- * [Rust](https://github.com/nikolay-govorov/nanoid)
492
- * [Swift](https://github.com/antiflasher/NanoID)
493
- * [V](https://github.com/invipal/nanoid)
494
-
495
- 此外,[CLI] 还可用于从命令行生成 ID。
496
-
497
- [CLI]: #cli
498
-
499
-
500
- ## 工具
501
-
502
- * [ID size 计算器] 显示调整时的冲突概率
503
- ID的字母或size。
504
- * [`nanoid-dictionary`] 与常用的字母一起使用 [`自定义字母`]。
505
- * [`nanoid-good`] 以确保你的ID不包含任何淫秽词汇。
506
-
507
- [`nanoid-dictionary`]: https://github.com/CyberAP/nanoid-dictionary
508
- [ID size 计算器]: https://zelark.github.io/nano-id-cc/
509
- [`自定义字母`]: #自定义字母或大小
510
- [`nanoid-good`]: https://github.com/y-gagar1n/nanoid-good
@@ -1,11 +0,0 @@
1
- let { promisify } = require('util')
2
- let { join } = require('path')
3
- let child = require('child_process')
4
-
5
- let exec = promisify(child.exec)
6
-
7
- it('prints unique ID', async () => {
8
- let { stdout, stderr } = await exec('node ' + join(__dirname, 'nanoid.cjs'))
9
- expect(stderr).toEqual('')
10
- expect(stdout).toMatch(/^[\w-]{21}\n$/)
11
- })