objectid-random 1.1.0 → 2.1.0
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/LICENSE +1 -1
- package/README.md +210 -1
- package/index.d.ts +56 -4
- package/index.js +21 -6
- package/package.json +10 -6
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2026 Liang Xingchen https://github.com/liangxingchen
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -1,2 +1,211 @@
|
|
|
1
1
|
# objectid-random
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
生成 MongoDB ObjectId 风格的随机 24 字符十六进制字符串。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 🎯 **零依赖** - 纯 JavaScript,无任何外部依赖
|
|
8
|
+
- ⚡ **极简 API** - 只有一个函数 `random()`
|
|
9
|
+
- 📅 **时间戳支持** - 可指定日期生成基于该时间的 ID
|
|
10
|
+
- 🔤 **类型安全** - 内置 TypeScript 类型定义
|
|
11
|
+
- 📦 **超小体积** - 仅 34 行源代码
|
|
12
|
+
|
|
13
|
+
## 使用场景
|
|
14
|
+
|
|
15
|
+
- 浏览器前端没有 mongodb 依赖情况下使用
|
|
16
|
+
- 生成指定时间的 ID
|
|
17
|
+
- 直接使用`ObjectId.createFromTime()`生成的 ID 第 9 位以后全部是 0
|
|
18
|
+
- 可以结合本库生成 `new ObjectId(random())`
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install objectid-random
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 快速开始
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
const random = require('objectid-random');
|
|
30
|
+
|
|
31
|
+
// 使用当前时间生成(最常用)
|
|
32
|
+
const id = random();
|
|
33
|
+
console.log(id); // '5ea6b7873c284f279c4afd60'
|
|
34
|
+
|
|
35
|
+
// 验证格式
|
|
36
|
+
console.log(/^[a-f0-9]{24}$/.test(id)); // true
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 使用示例
|
|
40
|
+
|
|
41
|
+
### 1. 生成随机 ID(最常用)
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
const random = require('objectid-random');
|
|
45
|
+
|
|
46
|
+
// 不传参数,使用当前时间
|
|
47
|
+
const id = random();
|
|
48
|
+
console.log(id); // '6789abcd1234567890123456'
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 2. 使用指定的 Date 对象
|
|
52
|
+
|
|
53
|
+
```javascript
|
|
54
|
+
const random = require('objectid-random');
|
|
55
|
+
|
|
56
|
+
const specificDate = new Date('2024-01-01T00:00:00Z');
|
|
57
|
+
const id = random(specificDate);
|
|
58
|
+
console.log(id); // '6568d800xxxxxxxxxxxxxxxx'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 3. 使用毫秒时间戳
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
const random = require('objectid-random');
|
|
65
|
+
|
|
66
|
+
// 使用 Date.getTime() 获取的毫秒时间戳
|
|
67
|
+
const timestamp = Date.now();
|
|
68
|
+
const id = random(timestamp);
|
|
69
|
+
console.log(id);
|
|
70
|
+
|
|
71
|
+
// 使用历史时间戳
|
|
72
|
+
const historicalId = random(946684800000); // 2000-01-01 00:00:00 UTC
|
|
73
|
+
console.log(historicalId); // '3b63a800xxxxxxxxxxxxxxxx'
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## API 参考
|
|
77
|
+
|
|
78
|
+
### `random([date])`
|
|
79
|
+
|
|
80
|
+
生成 MongoDB ObjectId 风格的随机 24 字符十六进制字符串。
|
|
81
|
+
|
|
82
|
+
#### 参数
|
|
83
|
+
|
|
84
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
85
|
+
| ------ | -------------------------- | ---- | -------- | ------------------------------------------------------- |
|
|
86
|
+
| `date` | `Date \| number \| object` | 否 | 当前时间 | 可选的日期对象、毫秒时间戳或具有 `getTime()` 方法的对象 |
|
|
87
|
+
|
|
88
|
+
#### 返回值
|
|
89
|
+
|
|
90
|
+
返回一个 24 字符的十六进制字符串,格式为 `[a-f0-9]{24}`。
|
|
91
|
+
|
|
92
|
+
#### 参数类型详解
|
|
93
|
+
|
|
94
|
+
1. **不传参数**:使用当前时间 `Date.now()`
|
|
95
|
+
|
|
96
|
+
```javascript
|
|
97
|
+
const id = random(); // 当前时间
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
2. **`Date` 对象**:使用该日期的时间戳
|
|
101
|
+
|
|
102
|
+
```javascript
|
|
103
|
+
const id = random(new Date('2024-01-01'));
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
3. **`number` 类型**:直接作为毫秒时间戳
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
const id = random(1704067200000); // 2024-01-01 00:00:00 UTC
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
4. **具有 `getTime()` 方法的对象**:调用该方法获取时间戳
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
const id = random({ getTime: () => Date.now() });
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
5. **具有 `toDate()` 方法的对象**(如 Moment):先转换为 Date
|
|
119
|
+
|
|
120
|
+
```javascript
|
|
121
|
+
const now = moment();
|
|
122
|
+
const id = random(now);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## TypeScript 类型定义
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
/**
|
|
129
|
+
* 生成 MongoDB ObjectId 风格的随机 24 字符十六进制字符串
|
|
130
|
+
*
|
|
131
|
+
* @param date - 可选的日期对象、毫秒时间戳或具有 getTime() 方法的对象
|
|
132
|
+
* @returns 24 字符的十六进制字符串,格式为 `[a-f0-9]{24}`
|
|
133
|
+
*/
|
|
134
|
+
declare function objectidRandom(
|
|
135
|
+
date?: Date | number | { getTime(): number } | { toDate: () => { getTime(): number } }
|
|
136
|
+
): string;
|
|
137
|
+
|
|
138
|
+
export = objectidRandom;
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### TypeScript 使用示例
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
import random from 'objectid-random';
|
|
145
|
+
|
|
146
|
+
// 不传参数
|
|
147
|
+
const id1: string = random();
|
|
148
|
+
|
|
149
|
+
// 传入 Date 对象
|
|
150
|
+
const id2: string = random(new Date());
|
|
151
|
+
|
|
152
|
+
// 传入时间戳
|
|
153
|
+
const id3: string = random(1704067200000);
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## 内部实现
|
|
157
|
+
|
|
158
|
+
生成的 ID 结构:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
[时间戳 12 字符] [随机值 12 字符]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
- **前 12 字符**:基于输入日期的毫秒级时间戳,转换为秒后转为十六进制(包含小数点后的毫秒部分),截取前 12 个字符
|
|
165
|
+
- 其中包含:秒级时间戳的十六进制(约 8 字符)+ 小数点后的毫秒十六进制部分
|
|
166
|
+
- **后 12 字符**:由 `Math.random()` 生成的随机十六进制字符串
|
|
167
|
+
|
|
168
|
+
### 与 MongoDB ObjectId 的对比
|
|
169
|
+
|
|
170
|
+
| 特性 | MongoDB ObjectId | objectid-random |
|
|
171
|
+
| ---------- | ------------------------ | ---------------------------------- |
|
|
172
|
+
| 时间戳长度 | 8 字符(纯秒级十六进制) | 12 字符(秒级十六进制 + 毫秒部分) |
|
|
173
|
+
| 机器标识 | 有 | 无(毫秒) |
|
|
174
|
+
| 进程 ID | 有 | 无(用随机替代) |
|
|
175
|
+
| 计数器 | 有 | 无(用随机替代) |
|
|
176
|
+
| 格式兼容 | ✓ | ✓ |
|
|
177
|
+
| 单调性 | 同一秒内自增 | 同一毫秒内不保证自增性(随机) |
|
|
178
|
+
|
|
179
|
+
> 注意:本库生成的 ID **不是真实的 MongoDB ObjectId**,但格式兼容,可以用于 MongoDB `_id` 字段。
|
|
180
|
+
|
|
181
|
+
## 常见问题
|
|
182
|
+
|
|
183
|
+
### Q: 生成的是真实的 MongoDB ObjectId 吗?
|
|
184
|
+
|
|
185
|
+
A: 不是。格式兼容(都是 24 字符十六进制字符串),但 MongoDB ObjectId 包含机器标识、进程 ID 和计数器,本库用随机值替代这些部分。
|
|
186
|
+
|
|
187
|
+
### Q: 相同时间生成的 ID 会重复吗?
|
|
188
|
+
|
|
189
|
+
A: 不会。虽然同一毫秒内生成的 ID 前 12 个字符(时间戳部分 + 毫秒部分)相同,但后 12 个字符是随机生成的,每次调用都不同。
|
|
190
|
+
|
|
191
|
+
**注意**:同一毫秒内生成的多个 ID **不保证自增性**,后缀完全随机。如果需要自增性,请使用 MongoDB 的原生 ObjectId。
|
|
192
|
+
|
|
193
|
+
### Q: 可以用于 MongoDB 的 `_id` 字段吗?
|
|
194
|
+
|
|
195
|
+
A: 不可以。本库生成的是字符串,并不是 MongoDB ObjectId 对象,但是可以通过 `ObjectId(id)` 转换为 MongoDB 的 ObjectId 对象。
|
|
196
|
+
|
|
197
|
+
```javascript
|
|
198
|
+
// 使用本库生成的 ID
|
|
199
|
+
await db.collection('users').insertOne({
|
|
200
|
+
_id: new ObjectId(random(specificDate)),
|
|
201
|
+
name: 'Alice'
|
|
202
|
+
});
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 许可证
|
|
206
|
+
|
|
207
|
+
MIT
|
|
208
|
+
|
|
209
|
+
## 作者
|
|
210
|
+
|
|
211
|
+
Liang - [GitHub](https://github.com/liangxingchen)
|
package/index.d.ts
CHANGED
|
@@ -1,7 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB ObjectId 风格的随机字符串生成器
|
|
3
|
+
*
|
|
4
|
+
* 生成的字符串格式:24 字符十六进制字符串 `[a-f0-9]{24}`
|
|
5
|
+
*
|
|
6
|
+
* 结构说明:
|
|
7
|
+
* - 前 12 个字符:基于输入日期的毫秒级时间戳,转换为秒后转为十六进制(包含小数点后的毫秒部分),截取前 12 个字符
|
|
8
|
+
* - 后 12 个字符:随机十六进制字符串
|
|
9
|
+
*
|
|
10
|
+
* 与 MongoDB ObjectId 的差异:
|
|
11
|
+
* - 时间戳长度:本库使用 12 字符毫秒级,MongoDB 使用 8 字符秒级,之后是机器标识等
|
|
12
|
+
* - 机器标识、进程 ID、计数器:本库用随机值替代
|
|
13
|
+
* - 单调性:本库同一毫秒内生成的 ID 不保证自增性,MongoDB 自增
|
|
14
|
+
* - 格式兼容:生成的字符串符合 ObjectId 格式,但不是真实的 ObjectId
|
|
15
|
+
*/
|
|
16
|
+
declare namespace objectidRandom {}
|
|
1
17
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
18
|
+
/**
|
|
19
|
+
* 生成 MongoDB ObjectId 风格的随机 24 字符十六进制字符串
|
|
20
|
+
*
|
|
21
|
+
* @param date - 可选的日期对象、毫秒时间戳或具有 `getTime()` 方法的对象
|
|
22
|
+
* - 如果是 `Date` 对象:使用该日期的时间戳
|
|
23
|
+
* - 如果是 `number`:直接作为毫秒时间戳
|
|
24
|
+
* - 如果是具有 `toDate()` 方法的对象(如 Mongoose Date):先转换为 Date
|
|
25
|
+
* - 如果是具有 `getTime()` 方法的对象:直接调用获取毫秒时间戳
|
|
26
|
+
* - 如果未提供:使用当前时间 `Date.now()`
|
|
27
|
+
*
|
|
28
|
+
* @returns 24 字符的十六进制字符串,格式为 `[a-f0-9]{24}`
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import random from 'objectid-random';
|
|
33
|
+
*
|
|
34
|
+
* // 使用当前时间生成(最常用)
|
|
35
|
+
* const id1 = random(); // '5ea6b7873c284f279c4afd60'
|
|
36
|
+
*
|
|
37
|
+
* // 使用指定的 Date 对象
|
|
38
|
+
* const id2 = random(new Date('2020-04-27')); // '5ea73167xxxxxxxxxxxxxxx'
|
|
39
|
+
*
|
|
40
|
+
* // 使用毫秒时间戳
|
|
41
|
+
* const id3 = random(1587984263235); // '5ea6b7873c284f279c4afd60'
|
|
42
|
+
*
|
|
43
|
+
* // 使用 Mongoose Date 对象
|
|
44
|
+
* const mongooseDate = new mongoose.Types.ObjectId();
|
|
45
|
+
* const id4 = random(mongooseDate); // '5ea6b787xxxxxxxxxxxxxxx'
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @remarks
|
|
49
|
+
* - 前 12 个字符包含:秒级时间戳的十六进制(约 8 字符)+ 小数点后的毫秒十六进制部分
|
|
50
|
+
* - 十六进制时间戳部分确保 12 个字符,不足用 '0' 填充
|
|
51
|
+
* - 剩余 12 个字符由 `Math.random()` 生成的随机十六进制填充
|
|
52
|
+
* - 同一毫秒内生成的多个 ID 前 12 个字符相同,后缀完全随机,不保证自增性
|
|
53
|
+
*
|
|
54
|
+
*/
|
|
55
|
+
declare function objectidRandom(
|
|
56
|
+
date?: Date | number | { getTime(): number } | { toDate: () => { getTime(): number } }
|
|
57
|
+
): string;
|
|
6
58
|
|
|
7
59
|
export = objectidRandom;
|
package/index.js
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
var pads = ['', '0', '00', '000', '0000', '00000', '000000'];
|
|
2
|
+
|
|
3
|
+
function getTime(date) {
|
|
4
|
+
if (date) {
|
|
5
|
+
if (typeof date === 'object') {
|
|
6
|
+
if (date.toDate) {
|
|
7
|
+
date = date.toDate();
|
|
8
|
+
}
|
|
9
|
+
if (date.getTime) {
|
|
10
|
+
date = date.getTime();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
if (date && typeof date === 'number') {
|
|
14
|
+
return date / 1000;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return Date.now() / 1000;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function random(date) {
|
|
21
|
+
var result = getTime(date).toString(16).replace('.', '').substr(0, 12);
|
|
7
22
|
if (result.length < 12) {
|
|
8
23
|
result += pads[12 - result.length];
|
|
9
24
|
}
|
package/package.json
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "objectid-random",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Generate random ObjectId",
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "Generate random ObjectId like string",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "node tests/index.js"
|
|
8
8
|
},
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "git+https://github.com/
|
|
11
|
+
"url": "git+https://github.com/liangxingchen/objectid-random.git"
|
|
12
|
+
},
|
|
13
|
+
"author": {
|
|
14
|
+
"name": "Liang",
|
|
15
|
+
"email": "liang@miaomo.cn",
|
|
16
|
+
"url": "https://github.com/liangxingchen"
|
|
12
17
|
},
|
|
13
|
-
"author": "Liang <liang@maichong.it> (https://github.com/liangxingchen)",
|
|
14
18
|
"license": "MIT",
|
|
15
19
|
"bugs": {
|
|
16
|
-
"url": "https://github.com/
|
|
20
|
+
"url": "https://github.com/liangxingchen/objectid-random/issues"
|
|
17
21
|
},
|
|
18
|
-
"homepage": "https://github.com/
|
|
22
|
+
"homepage": "https://github.com/liangxingchen/objectid-random#readme"
|
|
19
23
|
}
|