From a73b3cce26568cd1191949d2b8087f832dd8821a Mon Sep 17 00:00:00 2001 From: Zayden Jung Date: Mon, 18 May 2026 22:30:07 +0800 Subject: [PATCH] retains the original style while supporting custom lengths --- app/models/base.py | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/app/models/base.py b/app/models/base.py index 9113d4a..d825b9c 100644 --- a/app/models/base.py +++ b/app/models/base.py @@ -27,7 +27,7 @@ def encode_base62(num: int, length: int = None) -> str: return res -def encode_tablename_to_prefix(tablename: str, length: int = 3) -> str: +def encode_tablename_to_prefix(tablename: str, length: int) -> str: """ 将表名 encode 成固定长度的前缀,使用 MD5 拿到表名的唯一哈希值,转为整数后用 Base62 截取前 N 位 """ @@ -39,18 +39,17 @@ def encode_tablename_to_prefix(tablename: str, length: int = 3) -> str: num = int(hex_digest, 16) # 转为 Base62 字符串 - b62_str = encode_base62(num, length=length) - - # 截取固定长度(例如 3 位)作为该表的专属代码 - return b62_str[:length] + return encode_base62(num, length=length) -def gen_convex_payload() -> str: - """生成 128位 ULID 转 Base62 的趋势递增 Payload""" +def gen_convex_payload(length: int) -> str: + """生成固定长度的 ULID Payload""" u = ulid.new() - return encode_base62(u.int) + return encode_base62(u.int, length=length) +# --- 注入器类 --- + class AutoID: """ 全自动 Convex 风格 ID 注入器 @@ -68,18 +67,11 @@ class AutoID: # 获取子类配置的长度 p_len = cls._id_prefix_len s_len = cls._id_payload_len - - # 将表名编码为固定前缀(例如 "users" -> "7X1") - hasher = hashlib.md5(tablename.encode("utf-8")) - table_num = int(hasher.hexdigest(), 16) - table_prefix = encode_base62(table_num, length=p_len) + prefix = encode_tablename_to_prefix(tablename, length=p_len) # 核心工厂函数:拼接【编码后的表前缀】和【递增Payload】 def id_factory(): - # 生成固定长度的 Payload - u = ulid.new() - payload = encode_base62(u.int, length=s_len) - # 直接拼接,不带下划线 - return f"{table_prefix}{payload}" + payload = gen_convex_payload(length=s_len) + return f"{prefix}{payload}" return Column(String(p_len + s_len), primary_key=True, default=id_factory) \ No newline at end of file