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 生成器(独立于 MixinUtils.generateSnowflakeId,原 63 位算法不变)
2
+ * 128 位雪花 ID 生成器(优化版)
3
3
  *
4
4
  * 位布局(128 bit,无符号,BigInt 拼接后 Base58 编码返回):
5
- * - 64 bit 时间戳:相对 2024-01-01 00:00:00 UTC 的毫秒偏移
6
- * - 16 bit 机器ID:0-65535,优先参数 > 环境变量 SNOWFLAKE_MACHINE_ID > process.pid 低 16 位
7
- * - 48 bit 序列号:同一毫秒内自增,约 2.8e14 个/ms,实际不会耗尽
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),当前约 21 字符,理论最大 22 字符,建议 VARCHAR(24)
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
- * @param machineId 机器ID(0-65535),不传则依次从环境变量 SNOWFLAKE_MACHINE_ID、process.pid 获取
16
- * @returns Base58 编码的 128 位雪花 ID
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 生成器(独立于 MixinUtils.generateSnowflakeId,原 63 位算法不变)
3
+ * 128 位雪花 ID 生成器(优化版)
4
4
  *
5
5
  * 位布局(128 bit,无符号,BigInt 拼接后 Base58 编码返回):
6
- * - 64 bit 时间戳:相对 2024-01-01 00:00:00 UTC 的毫秒偏移
7
- * - 16 bit 机器ID:0-65535,优先参数 > 环境变量 SNOWFLAKE_MACHINE_ID > process.pid 低 16 位
8
- * - 48 bit 序列号:同一毫秒内自增,约 2.8e14 个/ms,实际不会耗尽
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),当前约 21 字符,理论最大 22 字符,建议 VARCHAR(24)
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 TS_SHIFT = BigInt(64);
17
- const MID_SHIFT = BigInt(48);
18
- const MID_MASK = BigInt(0xffff);
19
- const SEQ_MASK = BigInt('0xffffffffffff'); // 48 bit
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(16 bit) */
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
- * @param machineId 机器ID(0-65535),不传则依次从环境变量 SNOWFLAKE_MACHINE_ID、process.pid 获取
61
- * @returns Base58 编码的 128 位雪花 ID
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 << TS_SHIFT) | (mid << MID_SHIFT) | snowflakeExtSeq;
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,6 +1,6 @@
1
1
  {
2
2
  "name": "midway-fatcms",
3
- "version": "0.0.18",
3
+ "version": "0.0.19",
4
4
  "description": "This is a midway component sample",
5
5
  "main": "dist/index.js",
6
6
  "typings": "index.d.ts",
@@ -1,20 +1,25 @@
1
1
  /**
2
- * 128 位雪花 ID 生成器(独立于 MixinUtils.generateSnowflakeId,原 63 位算法不变)
2
+ * 128 位雪花 ID 生成器(优化版)
3
3
  *
4
4
  * 位布局(128 bit,无符号,BigInt 拼接后 Base58 编码返回):
5
- * - 64 bit 时间戳:相对 2024-01-01 00:00:00 UTC 的毫秒偏移
6
- * - 16 bit 机器ID:0-65535,优先参数 > 环境变量 SNOWFLAKE_MACHINE_ID > process.pid 低 16 位
7
- * - 48 bit 序列号:同一毫秒内自增,约 2.8e14 个/ms,实际不会耗尽
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),当前约 21 字符,理论最大 22 字符,建议 VARCHAR(24)
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 TS_SHIFT = BigInt(64);
15
- const MID_SHIFT = BigInt(48);
16
- const MID_MASK = BigInt(0xffff);
17
- const SEQ_MASK = BigInt('0xffffffffffff'); // 48 bit
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(16 bit) */
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
- * @param machineId 机器ID(0-65535),不传则依次从环境变量 SNOWFLAKE_MACHINE_ID、process.pid 获取
65
- * @returns Base58 编码的 128 位雪花 ID
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 << TS_SHIFT) | (mid << MID_SHIFT) | snowflakeExtSeq;
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 };