midway-fatcms 0.0.18 → 0.0.19
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.
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 128 位雪花 ID
|
|
2
|
+
* 128 位雪花 ID 生成器(优化版)
|
|
3
3
|
*
|
|
4
4
|
* 位布局(128 bit,无符号,BigInt 拼接后 Base58 编码返回):
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
5
|
+
* - 41 bit 时间戳:相对 2024-01-01 00:00:00 UTC 的毫秒偏移,可用约 69 年(至 ~2093 年)
|
|
6
|
+
* - 10 bit 机器ID:0-1023,与标准 64 位雪花 ID 一致,优先参数 > 环境变量 > process.pid
|
|
7
|
+
* - 77 bit 序列号:同一毫秒内自增,2^77 ≈ 1.5×10²³,无需考虑耗尽
|
|
8
8
|
*
|
|
9
|
-
* 输出:Bitcoin 字母表 Base58(无 0/O/I/l
|
|
9
|
+
* 输出:Bitcoin 字母表 Base58(无 0/O/I/l),左填充 '1' 至恒定 22 字符,建议 VARCHAR(24)
|
|
10
|
+
* 时间戳在高位,ID 随时间单调递增,适合做数据库主键。
|
|
11
|
+
* 2^128-1 < 58^22,故 22 字符足以覆盖全部 128 位取值范围。
|
|
10
12
|
*/
|
|
11
13
|
declare const EPOCH: bigint;
|
|
12
14
|
/**
|
|
13
|
-
* 生成 128 位雪花 ID(Base58
|
|
15
|
+
* 生成 128 位雪花 ID(Base58 字符串,恒定 22 字符)
|
|
14
16
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
+
* 位布局:41 bit 时间戳 | 10 bit 机器ID | 77 bit 序列号
|
|
18
|
+
* 时间戳采用 41 bit(与标准 64 位雪花 ID 一致),毫秒精度,可用约 69 年。
|
|
19
|
+
* 机器ID 采用 10 bit(0-1023),与标准 64 位雪花 ID 一致,防止多机 ID 冲突。
|
|
20
|
+
* 时间戳在高位,ID 随时间单调递增,适合做数据库主键。
|
|
21
|
+
* Base58 输出左填充 '1'(零字符)至 22 字符,保证长度恒定且不破坏字典序排序。
|
|
22
|
+
*
|
|
23
|
+
* @param machineId 机器ID(0-1023),不传则依次从环境变量 SNOWFLAKE_MACHINE_ID、process.pid 获取
|
|
24
|
+
* @returns Base58 编码的 128 位雪花 ID(恒定 22 字符)
|
|
17
25
|
*/
|
|
18
26
|
declare function generateSnowflakeIdExt(machineId?: number): string;
|
|
19
27
|
export { generateSnowflakeIdExt, EPOCH as SNOWFLAKE_EXT_EPOCH };
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* 128 位雪花 ID
|
|
3
|
+
* 128 位雪花 ID 生成器(优化版)
|
|
4
4
|
*
|
|
5
5
|
* 位布局(128 bit,无符号,BigInt 拼接后 Base58 编码返回):
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
6
|
+
* - 41 bit 时间戳:相对 2024-01-01 00:00:00 UTC 的毫秒偏移,可用约 69 年(至 ~2093 年)
|
|
7
|
+
* - 10 bit 机器ID:0-1023,与标准 64 位雪花 ID 一致,优先参数 > 环境变量 > process.pid
|
|
8
|
+
* - 77 bit 序列号:同一毫秒内自增,2^77 ≈ 1.5×10²³,无需考虑耗尽
|
|
9
9
|
*
|
|
10
|
-
* 输出:Bitcoin 字母表 Base58(无 0/O/I/l
|
|
10
|
+
* 输出:Bitcoin 字母表 Base58(无 0/O/I/l),左填充 '1' 至恒定 22 字符,建议 VARCHAR(24)
|
|
11
|
+
* 时间戳在高位,ID 随时间单调递增,适合做数据库主键。
|
|
12
|
+
* 2^128-1 < 58^22,故 22 字符足以覆盖全部 128 位取值范围。
|
|
11
13
|
*/
|
|
12
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
15
|
exports.SNOWFLAKE_EXT_EPOCH = exports.generateSnowflakeIdExt = void 0;
|
|
14
16
|
const EPOCH = BigInt(1704067200000); // 2024-01-01 00:00:00 UTC
|
|
15
17
|
exports.SNOWFLAKE_EXT_EPOCH = EPOCH;
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
18
|
+
const TS_BITS = BigInt(41);
|
|
19
|
+
const MID_BITS = BigInt(10);
|
|
20
|
+
const SEQ_BITS = BigInt(77);
|
|
21
|
+
const TS_MASK = (BigInt(1) << TS_BITS) - BigInt(1); // 41 bit
|
|
22
|
+
const MID_MASK = (BigInt(1) << MID_BITS) - BigInt(1); // 10 bit
|
|
23
|
+
const SEQ_MASK = (BigInt(1) << SEQ_BITS) - BigInt(1); // 77 bit
|
|
24
|
+
const PAD_LENGTH = 22;
|
|
20
25
|
const SEQ_START = BigInt(1);
|
|
21
26
|
const DRIFT_TOLERANCE = BigInt(5);
|
|
22
27
|
/** Bitcoin Base58 字母表 */
|
|
@@ -38,7 +43,7 @@ function encodeBase58(value) {
|
|
|
38
43
|
}
|
|
39
44
|
return result;
|
|
40
45
|
}
|
|
41
|
-
/** 解析机器 ID(
|
|
46
|
+
/** 解析机器 ID(10 bit,0-1023) */
|
|
42
47
|
function resolveMachineId(machineId) {
|
|
43
48
|
var _a;
|
|
44
49
|
let mid = Number(machineId);
|
|
@@ -55,10 +60,16 @@ function resolveMachineId(machineId) {
|
|
|
55
60
|
return BigInt(Math.abs(mid)) & MID_MASK;
|
|
56
61
|
}
|
|
57
62
|
/**
|
|
58
|
-
* 生成 128 位雪花 ID(Base58
|
|
63
|
+
* 生成 128 位雪花 ID(Base58 字符串,恒定 22 字符)
|
|
59
64
|
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
65
|
+
* 位布局:41 bit 时间戳 | 10 bit 机器ID | 77 bit 序列号
|
|
66
|
+
* 时间戳采用 41 bit(与标准 64 位雪花 ID 一致),毫秒精度,可用约 69 年。
|
|
67
|
+
* 机器ID 采用 10 bit(0-1023),与标准 64 位雪花 ID 一致,防止多机 ID 冲突。
|
|
68
|
+
* 时间戳在高位,ID 随时间单调递增,适合做数据库主键。
|
|
69
|
+
* Base58 输出左填充 '1'(零字符)至 22 字符,保证长度恒定且不破坏字典序排序。
|
|
70
|
+
*
|
|
71
|
+
* @param machineId 机器ID(0-1023),不传则依次从环境变量 SNOWFLAKE_MACHINE_ID、process.pid 获取
|
|
72
|
+
* @returns Base58 编码的 128 位雪花 ID(恒定 22 字符)
|
|
62
73
|
*/
|
|
63
74
|
function generateSnowflakeIdExt(machineId) {
|
|
64
75
|
const mid = resolveMachineId(machineId);
|
|
@@ -74,16 +85,12 @@ function generateSnowflakeIdExt(machineId) {
|
|
|
74
85
|
}
|
|
75
86
|
if (ts === snowflakeExtLastTs) {
|
|
76
87
|
snowflakeExtSeq = (snowflakeExtSeq + BigInt(1)) & SEQ_MASK;
|
|
77
|
-
if (snowflakeExtSeq === BigInt(0)) {
|
|
78
|
-
ts = snowflakeExtLastTs + BigInt(1);
|
|
79
|
-
snowflakeExtSeq = SEQ_START;
|
|
80
|
-
}
|
|
81
88
|
}
|
|
82
89
|
else {
|
|
83
90
|
snowflakeExtSeq = SEQ_START;
|
|
84
91
|
}
|
|
85
92
|
snowflakeExtLastTs = ts;
|
|
86
|
-
const id = (ts <<
|
|
87
|
-
return encodeBase58(id);
|
|
93
|
+
const id = ((ts & TS_MASK) << (MID_BITS + SEQ_BITS)) | (mid << SEQ_BITS) | snowflakeExtSeq;
|
|
94
|
+
return encodeBase58(id).padStart(PAD_LENGTH, BASE58_ALPHABET[0]);
|
|
88
95
|
}
|
|
89
96
|
exports.generateSnowflakeIdExt = generateSnowflakeIdExt;
|
package/package.json
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 128 位雪花 ID
|
|
2
|
+
* 128 位雪花 ID 生成器(优化版)
|
|
3
3
|
*
|
|
4
4
|
* 位布局(128 bit,无符号,BigInt 拼接后 Base58 编码返回):
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
5
|
+
* - 41 bit 时间戳:相对 2024-01-01 00:00:00 UTC 的毫秒偏移,可用约 69 年(至 ~2093 年)
|
|
6
|
+
* - 10 bit 机器ID:0-1023,与标准 64 位雪花 ID 一致,优先参数 > 环境变量 > process.pid
|
|
7
|
+
* - 77 bit 序列号:同一毫秒内自增,2^77 ≈ 1.5×10²³,无需考虑耗尽
|
|
8
8
|
*
|
|
9
|
-
* 输出:Bitcoin 字母表 Base58(无 0/O/I/l
|
|
9
|
+
* 输出:Bitcoin 字母表 Base58(无 0/O/I/l),左填充 '1' 至恒定 22 字符,建议 VARCHAR(24)
|
|
10
|
+
* 时间戳在高位,ID 随时间单调递增,适合做数据库主键。
|
|
11
|
+
* 2^128-1 < 58^22,故 22 字符足以覆盖全部 128 位取值范围。
|
|
10
12
|
*/
|
|
11
13
|
|
|
12
14
|
const EPOCH = BigInt(1704067200000); // 2024-01-01 00:00:00 UTC
|
|
13
15
|
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
16
|
+
const TS_BITS = BigInt(41);
|
|
17
|
+
const MID_BITS = BigInt(10);
|
|
18
|
+
const SEQ_BITS = BigInt(77);
|
|
19
|
+
const TS_MASK = (BigInt(1) << TS_BITS) - BigInt(1); // 41 bit
|
|
20
|
+
const MID_MASK = (BigInt(1) << MID_BITS) - BigInt(1); // 10 bit
|
|
21
|
+
const SEQ_MASK = (BigInt(1) << SEQ_BITS) - BigInt(1); // 77 bit
|
|
22
|
+
const PAD_LENGTH = 22;
|
|
18
23
|
|
|
19
24
|
const SEQ_START = BigInt(1);
|
|
20
25
|
const DRIFT_TOLERANCE = BigInt(5);
|
|
@@ -41,7 +46,7 @@ function encodeBase58(value: bigint): string {
|
|
|
41
46
|
return result;
|
|
42
47
|
}
|
|
43
48
|
|
|
44
|
-
/** 解析机器 ID(
|
|
49
|
+
/** 解析机器 ID(10 bit,0-1023) */
|
|
45
50
|
function resolveMachineId(machineId?: number): bigint {
|
|
46
51
|
let mid = Number(machineId);
|
|
47
52
|
if (machineId === undefined || machineId === null || isNaN(mid)) {
|
|
@@ -59,10 +64,16 @@ function resolveMachineId(machineId?: number): bigint {
|
|
|
59
64
|
}
|
|
60
65
|
|
|
61
66
|
/**
|
|
62
|
-
* 生成 128 位雪花 ID(Base58
|
|
67
|
+
* 生成 128 位雪花 ID(Base58 字符串,恒定 22 字符)
|
|
63
68
|
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
69
|
+
* 位布局:41 bit 时间戳 | 10 bit 机器ID | 77 bit 序列号
|
|
70
|
+
* 时间戳采用 41 bit(与标准 64 位雪花 ID 一致),毫秒精度,可用约 69 年。
|
|
71
|
+
* 机器ID 采用 10 bit(0-1023),与标准 64 位雪花 ID 一致,防止多机 ID 冲突。
|
|
72
|
+
* 时间戳在高位,ID 随时间单调递增,适合做数据库主键。
|
|
73
|
+
* Base58 输出左填充 '1'(零字符)至 22 字符,保证长度恒定且不破坏字典序排序。
|
|
74
|
+
*
|
|
75
|
+
* @param machineId 机器ID(0-1023),不传则依次从环境变量 SNOWFLAKE_MACHINE_ID、process.pid 获取
|
|
76
|
+
* @returns Base58 编码的 128 位雪花 ID(恒定 22 字符)
|
|
66
77
|
*/
|
|
67
78
|
function generateSnowflakeIdExt(machineId?: number): string {
|
|
68
79
|
const mid = resolveMachineId(machineId);
|
|
@@ -82,18 +93,14 @@ function generateSnowflakeIdExt(machineId?: number): string {
|
|
|
82
93
|
|
|
83
94
|
if (ts === snowflakeExtLastTs) {
|
|
84
95
|
snowflakeExtSeq = (snowflakeExtSeq + BigInt(1)) & SEQ_MASK;
|
|
85
|
-
if (snowflakeExtSeq === BigInt(0)) {
|
|
86
|
-
ts = snowflakeExtLastTs + BigInt(1);
|
|
87
|
-
snowflakeExtSeq = SEQ_START;
|
|
88
|
-
}
|
|
89
96
|
} else {
|
|
90
97
|
snowflakeExtSeq = SEQ_START;
|
|
91
98
|
}
|
|
92
99
|
|
|
93
100
|
snowflakeExtLastTs = ts;
|
|
94
101
|
|
|
95
|
-
const id = (ts <<
|
|
96
|
-
return encodeBase58(id);
|
|
102
|
+
const id = ((ts & TS_MASK) << (MID_BITS + SEQ_BITS)) | (mid << SEQ_BITS) | snowflakeExtSeq;
|
|
103
|
+
return encodeBase58(id).padStart(PAD_LENGTH, BASE58_ALPHABET[0]);
|
|
97
104
|
}
|
|
98
105
|
|
|
99
106
|
export { generateSnowflakeIdExt, EPOCH as SNOWFLAKE_EXT_EPOCH };
|