ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

在 PGlite 中使用 pg_hashids 扩展:为 PostgreSQL 数字主键生成短链接风格 ID

在 PGlite 中使用 pg_hashids 扩展:为 PostgreSQL 数字主键生成短链接风格 ID 在 PGlite 中使用 pg_hashids 扩展为 PostgreSQL 数字主键生成短链接风格 ID【免费下载链接】pgliteEmbeddable Postgres with real-time, reactive bindings.项目地址: https://gitcode.com/GitHub_Trending/pg/pglite导读本文讲解如何在嵌入式 PostgreSQLPGliteWASM 运行时中集成electric-sql/pglite-pg_hashids扩展通过id_encode/id_decode/id_decode_once三个 SQL 函数把自增整数主键编码成类似 YouTube 风格的短字符串并在需要时无损还原。读完本文你将掌握该扩展的安装、初始化、全部函数参数salt 盐值、最小长度、自定义字母表的使用方法以及它在 PGlite 扩展体系中的底层加载原理与测试验证方式。pg_hashids 是什么pg_hashids 是 PostgreSQL 生态中的一个扩展它基于 Hashids 算法将整数编码为简短、可读、可逆的字符串标识符。典型应用场景包括把自增主键如1001编码成对外暴露的短 ID如jNl避免用户直接猜测数据库记录总数生成 URL 友好的短链接或邀请码在日志、消息队列中替代冗长的数字 ID。需要注意Hashids 属于可逆的混淆编码方案而非加密编码后的字符串可通过id_decode/id_decode_once还原为原始整数。它适合不想让 ID 一眼被看穿的场景并不提供密码学意义上的保密性——这一点从扩展同时提供编码与解码函数即可印证。安装在项目中通过 npm 安装扩展包npm install electric-sql/pglite-pg_hashids该包的peerDependencies声明了electric-sql/pgliteworkspace 版本因此需要与 PGlite 主包一同使用当前仓库中该扩展的版本为0.0.5依赖electric-sql/pglite0.5.4见 packages/pglite-pg_hashids/package.json 与 CHANGELOG.md。基础用法注册扩展并编码在创建 PGlite 实例时通过extensions选项注册pg_hashids随后执行CREATE EXTENSION并调用编码函数import { PGlite } from electric-sql/pglite import { pg_hashids } from electric-sql/pglite-pg_hashids const pg new PGlite({ extensions: { pg_hashids, }, }) await pg.exec(CREATE EXTENSION IF NOT EXISTS pg_hashids;) const res await pg.exec(SELECT id_encode(1001);) // res[0].rows[0].id_encode jNlextensions选项来自 PGliteOptions它以命名空间为键、以Extension对象或资源 URL 为值。注册后Postgres 的 WASM 运行时才能在启动时把扩展的动态库与 SQL 定义加载进虚拟文件系统。核心函数与参数详解该扩展提供三个核心 SQL 函数均支持可选的salt、min_length、alphabet参数按此顺序依次传入。以下示例中的输出值均取自仓库测试用例 packages/pglite-pg_hashids/tests/pg_hashids.test.ts可直接复制运行验证。id_encode整数 → 短字符串最基本的形式使用默认字母表和空盐值SELECT id_encode(1001); -- jNl传入自定义盐值salt可以打乱编码结果使同样的数字在不同盐值下得到不同字符串SELECT id_encode(1234567, This is my salt); -- Pdzxp传入最小长度min_length不足部分会填充保证输出至少达到指定字符数SELECT id_encode(1234567, This is my salt, 10); -- PlRPdzxpR7传入自定义字母表alphabet限定编码使用的字符集SELECT id_encode(1234567, This is my salt, 10, abcdefghijABCDxFGHIJ1234567890); -- 3GJ956J9B9id_decode短字符串 → 整数数组id_decode返回还原后的整数数组Hashids 算法本身支持将多个数字编码进一个字符串解码时以数组返回SELECT id_decode(PlRPdzxpR7, This is my salt, 10); -- [1234567] SELECT id_decode(3GJ956J9B9, This is my salt, 10, abcdefghijABCDxFGHIJ1234567890); -- [1234567]注意解码时必须使用与编码时完全一致的 salt、min_length、alphabet否则无法还原出原始整数。id_decode_once短字符串 → 单个整数id_decode_once与id_decode等价但直接返回单个整数而非数组适合一个 ID 对应一个主键的常见场景SELECT id_decode_once(jNl); -- 1001 SELECT id_decode_once(Pdzxp, This is my salt); -- 1234567 SELECT id_decode_once(PlRPdzxpR7, This is my salt, 10); -- 1234567 SELECT id_decode_once(3GJ956J9B9, This is my salt, 10, abcdefghijABCDxFGHIJ1234567890); -- 1234567参数速查参数含义示例备注number待编码的整数1001必填salt盐值字符串This is my salt可选默认空字符串影响混淆结果min_length输出最小长度10可选不足自动填充alphabet自定义字母表abcdefghijABCDxFGHIJ1234567890可选默认使用内置字母表底层原理PGlite 扩展如何加载从源码看pg_hashids是一个典型的 PGlite 扩展包由「前端 TypeScript 注册代码」与「预编译的 Postgres 扩展产物」两部分组成。扩展注册对象前端入口 packages/pglite-pg_hashids/src/index.ts 导出一个符合 PGliteExtension接口的对象const setup async (_pg: PGliteInterface, emscriptenOpts: any) { return { emscriptenOpts, bundlePath: new URL(../release/pg_hashids.tar.gz, import.meta.url), } satisfies ExtensionSetupResult } export const pg_hashids { name: pg_hashids, setup, } satisfies Extension这里name是扩展的人类可读名称setup返回ExtensionSetupResult核心是bundlePath——指向release/pg_hashids.tar.gz扩展产物包。Extension与ExtensionSetupResult接口定义见 packages/pglite/src/interface.ts接口还支持namespaceObj、sharedPreloadLibraries、init、close等可选能力可用于暴露自定义 API 或在启动/关闭时执行钩子详见 扩展开发文档。产物包的加载与解包bundlePath指向的 tar.gz 会在 PGlite 启动时被读取Node 环境下通过fszlib流式解压浏览器环境下通过fetchDecompressionStream(gzip)解压见 packages/pglite/src/extensionUtils.ts随后将.so动态库预加载进 Emscripten 虚拟文件系统并交给 Postgres 的dlopen使用同文件loadExtension实现。也就是说你无需手动管理扩展的二进制文件注册对象已把一切打包好。构建流程pg_hashids的 WASM 产物由tsup构建并复制进dist目录tsup.config.ts在打包成功后把release/pg_hashids.tar.gz复制到dist/pg_hashids.tar.gzscripts/bundle-wasm.ts 再将源码中的../release/路径替换为./确保运行时能从包内正确解析产物路径。这与仓库中其他扩展包如 pgvector、postgis的构建模式一致。测试验证开箱即用的行为保障仓库为扩展提供了完整的 vitest 测试见 packages/pglite-pg_hashids/tests/pg_hashids.test.ts覆盖了扩展可加载性通过查询pg_extension系统表确认pg_hashids已注册默认参数编码id_encode(1001)输出jNl带盐编码id_encode(1234567, This is my salt)输出Pdzxp最小长度与自定义字母表验证min_length与alphabet参数生效双向还原对上述所有编码结果执行id_decode/id_decode_once均能还原为1234567或1001。测试还演示了一个实用技巧首次实例化后通过dumpDataDir(gzip)导出数据目录归档后续测试实例通过loadDataDir复用可显著加快反复启动 PGlite 的测试速度。你可以进入packages/pglite-pg_hashids目录运行pnpm test复现以上全部行为。使用建议与注意事项盐值一经使用不可更改线上已有编码数据后更换 salt 会导致历史 ID 全部无法解码需提前规划min_length 应保持稳定解码依赖编码时的参数业务升级时应避免随意调整最小长度明确混淆与加密的边界Hashids 可逆、可被暴力探测不要用它保护敏感数据只用于隐藏递增规律等低安全诉求场景配合 PGlite 使用pg_hashids依赖electric-sql/pglite的扩展机制需与主包版本匹配当前为 0.5.x 系列。总结electric-sql/pglite-pg_hashids为嵌入式 Postgres 提供了开箱即用的短 ID 编码能力一条CREATE EXTENSION加上id_encode即可把主键转换为友好的短字符串id_decode_once负责还原salt、最小长度与自定义字母表提供了灵活的混淆与格式控制。通过本文的源码分析与测试用例你可以放心地将其集成到基于 PGlite 的应用中为 URL、日志或对外接口提供更精致的 ID 形态。【免费下载链接】pgliteEmbeddable Postgres with real-time, reactive bindings.项目地址: https://gitcode.com/GitHub_Trending/pg/pglite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表