在 PostgreSQL 中使用 pgcrypto 与 CTE 生成加密安全的随机字母数字标识符
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载导读本文介绍如何在 PostgreSQL 中仅用一条查询语句基于pgcrypto扩展的gen_random_bytes()函数与通用表表达式CTE生成加密安全cryptographically random的 8 位字母数字短标识符short id。这类标识符适合作为优惠码、邀请码、短链接 ID、订单号等对可读性与安全性都有要求的场景。读完本文你将掌握字符集为何要剔除易混淆字符、get_byte与取模映射的原理、如何自由调整标识符长度以及如何扩展为批量生成多个标识符的实用写法。一、先决条件启用 pgcrypto 扩展gen_random_bytes()由随 PostgreSQL 一同发布的pgcrypto扩展提供。该扩展包含多种随机数据与哈希函数例如gen_random_uuid()、digest()、crypt()与gen_salt()等可参考仓库中的 compute-hashes-with-pgcrypto.md、generating-uuids-with-pgcrypto.md 与 salt-and-hash-a-password-with-pgcrypto.md。因此执行生成语句前需要先安装该扩展create extension if not exists pgcrypto;该语句以数据库为单位安装扩展只需在目标数据库执行一次从 PostgreSQL 13 开始gen_random_uuid()已内置进核心但gen_random_bytes()仍需pgcrypto扩展详见仓库文档 generate-random-uuids-without-an-extension.md。二、核心查询一行 SQL 生成 8 位随机标识符-- First ensure pgcrypto is installed create extension if not exists pgcrypto; -- Generates a single 8-character identifier with chars as ( -- excludes some look-alike characters select 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz as charset ), random_bytes as ( select gen_random_bytes(8) as bytes ), random_bytes as ( select gen_random_bytes(8) as bytes ), positions as ( select generate_series(0, 7) as pos ) select string_agg( substr( charset, (get_byte(bytes, pos) % length(charset)) 1, 1 ), order by pos ) as short_id from positions, random_bytes, chars;注意上例中random_bytes一行是重复占位示意——实际使用时应只保留一份random_bytes的 CTE 定义否则会出现同名 CTE 冲突。标准写法如下并且一次执行即产出一行结果with chars as ( select 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz as charset ), random_bytes as ( select gen_random_bytes(8) as bytes ), positions as ( select generate_series(0, 7) as pos ) select string_agg( substr(charset, (get_byte(bytes, pos) % length(charset)) 1, 1), order by pos ) as short_id from positions, random_bytes, chars;典型的输出结果如下---------- | short_id | |----------| | NXdu9AnV | ----------三、逐层拆解三个 CTE 与一次映射聚合整个查询由三个 CTE 与最终一条select组成结构清晰、每一层只做一件事1.chars定义可输出字符集23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz该字符串刻意排除了若干容易相互混淆的字符这正是短标识符工程实践的关键细节数字0与字母O、o均不在字符集中数字1与字母l、I均不在字符集中同时剔除了大写的I。剩余字符为数字2-98 个、大写字母A-Z中除I、O外的 24 个、小写字母a-z中除i、l、o外的 23 个合计 55 个候选字符。这一取舍保证了生成结果在传真、手写、印刷体等场景下不易误读。2.random_bytes获取加密安全的随机字节select gen_random_bytes(8) as bytesgen_random_bytes(n)返回n个加密安全伪随机字节bytea 类型。这里取 8 个字节对应最终 8 位字符。它由 PostgreSQL 内部基于密码学安全随机源产生适用于生成会话令牌、邀请码等需要不可预测性的场景。3.positions构造 0 到 7 的下标序列select generate_series(0, 7) as posgenerate_series(start, stop)生成从0到7的 8 行整数序列用来遍历bytes中 8 个字节位置。该函数是 PostgreSQL 中最常用的集合返回函数之一也可用于批量造数参见仓库中的 generate-series-of-numbers.md 与 insert-a-bunch-of-records-with-generate-series.md。4. 最终 select字节 → 字符的映射与聚合select string_agg( substr(charset, (get_byte(bytes, pos) % length(charset)) 1, 1), order by pos ) as short_id from positions, random_bytes, chars;get_byte(bytes, pos)取出第pos个字节的无符号整数值0–255% length(charset)即% 55将该值映射到0–54的字符集下标范围随后 1使其与substr的 1 起始位置对齐substr(charset, ..., 1)取出对应位置的单个字符三个 CTE 以逗号连接形成笛卡尔积from positions, random_bytes, chars使每一行都拥有pos、bytes、charset三个来源string_agg(..., order by pos)按pos顺序把 8 个字符拼接成最终字符串。该方案对 8 个字节的利用率略低于完美255 不能被 55 整除映射存在轻微偏差但在短标识符场景中可忽略不计且代码直观、易于维护。四、两个实用扩展1. 改变标识符长度将generate_series(0, 7)的右边界改为N-1同时把gen_random_bytes(8)改为gen_random_bytes(N)即可生成任意长度的标识符。例如 16 位标识符with chars as ( select 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz as charset ), random_bytes as ( select gen_random_bytes(16) as bytes ), positions as ( select generate_series(0, 15) as pos ) select string_agg( substr(charset, (get_byte(bytes, pos) % length(charset)) 1, 1), order by pos ) as short_id from positions, random_bytes, chars;2. 一次生成多条标识符只需额外引入一个批量序号 CTE即可在一句查询中产出多行结果适用于批量发放邀请码with chars as ( select 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz as charset ), batch as ( select generate_series(1, 10) as n ), random_bytes as ( select n, gen_random_bytes(8) as bytes from batch ), positions as ( select generate_series(0, 7) as pos ) select n, string_agg( substr(charset, (get_byte(bytes, pos) % length(charset)) 1, 1), order by pos ) as short_id from positions, random_bytes, chars group by n order by n;五、与 UUID 等替代方案的取舍PostgreSQL 生态中还常见两类标识符生成方式可结合场景对比gen_random_uuid()同样来自pgcryptoPostgreSQL 13 起内置生成 v4 随机 UUID如0a557c31-0632-4d3e-a349-e0adefb66a69全局唯一性强但长度达 36 字符不适合需要人工抄录或直接展示给用户的短码场景见 generating-uuids-with-pgcrypto.md 与 generate-random-uuids-without-an-extension.mduuid-ossp扩展的uuid_generate_v4()功能类似但官方文档指出 OSSP UUID 库维护不活跃仅在需要非 v4 版本 UUID 函数时才推荐见 generate-a-uuid.md。相比之下本文方案输出的是紧凑、可读、防混淆的字母数字短码且随机性同样源自密码学安全随机源适合作为优惠码、邀请码、短 ID 等业务主键之外的人读友好标识。六、小结核心组件pgcrypto扩展gen_random_bytesgenerate_series下标序列get_byte/substr字节映射string_agg拼接字符集剔除0/O/o、1/l/I等易混淆字符共 55 个候选字符调整generate_series上界与gen_random_bytes字节数即可改变标识符长度借助批量 CTE 可一次性生成多条标识符直接用于批量发码。如需进一步了解pgcrypto的其他能力哈希、口令加盐等可继续阅读仓库中的 compute-hashes-with-pgcrypto.md 与 salt-and-hash-a-password-with-pgcrypto.md。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐NautilusTrader随机数生成加密安全随机数在交易中的应用NautilusTrader随机数生成加密安全随机数在交易中的应用 引言为什么交易系统需要加密安全随机数 在算法交易领域随机数生成看似简单实则至关重要金融科技后端Kratos 随机字符串生成库 randx 详解加密安全的字符序列生成与均匀分布保证Kratos 随机字符串生成库 randx 详解加密安全的字符序列生成与均匀分布保证 导读 本文围绕 Ory Kratos 仓库中 oryx/randx/RE后端认证鉴权30 Seconds of Code 实战用 JavaScript 生成指定长度的随机字母数字字符串30 Seconds of Code 实战用 JavaScript 生成指定长度的随机字母数字字符串 导读 本文以 30 seconds of code 仓库教程文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI编程助手如何更靠谱?Claude Code superpowers的TDD工作流实践

AI编程助手如何更靠谱?Claude Code superpowers的TDD工作流实践

Claude Code 用了两个多月,我一度觉得瓶颈不在模型,而在工作流。每次让它改需求,它总是很积极地写出一大堆代码,然后告诉我"完成了",可我一跑测试就红成一片。直到我装上 superpowers 这套 Skills&#xff0…

2026/10/12 21:45:59 阅读更多 →
javascript.info 网络专题:为什么跨域请求需要 Origin 头而不是只靠 Referer

javascript.info 网络专题:为什么跨域请求需要 Origin 头而不是只靠 Referer

文档/教程前端 【免费下载链接】en.javascript.info Modern JavaScript Tutorial 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info 点击查看 免费下载 HTTP 的 Referer 头携带了发起请求的完整页面地址,信息量似乎比 Origin 更丰富&a…

2026/10/12 21:46:02 阅读更多 →
microbit的外围电路

microbit的外围电路

microbit自带的LED、按钮和传感器已经很有趣了,但想让它真正“走进生活”——感知光线的明暗、发现火情、控制灯和风扇的开关——就需要给它接上外围电路:传感器负责“感知”,蜂鸣器、继电器等负责“动作”。 这份任务说明书带你借助micro:bi…

2026/10/15 21:58:46 阅读更多 →

最新新闻

SpringBoot 3.x嵌入式容器调优与SSL证书自动热更新实战

SpringBoot 3.x嵌入式容器调优与SSL证书自动热更新实战

2026 年了,如果你还在用“改配置 -> 重启应用 -> 半夜被叫起来”这套流程处理证书过期问题,那真的有必要看看这章内容。SpringBoot 3.x 的嵌入式容器早就不是当年那个“帮你省个 Tomcat 安装”的毛坯房了,尤其在 HTTPS 证书管理这件事上…

2026/10/19 4:17:39 阅读更多 →
open-code-review:基于Git Diff与LLM Agent的CLI代码审查实践

open-code-review:基于Git Diff与LLM Agent的CLI代码审查实践

1. 这不是又一个“AI代码审查”玩具:open-code-review 是怎么把 Git 差异、CLI 交互和 LLM 推理拧成一股实用绳子的你搜“open-code-review”,大概率会撞上一堆带“AI”“智能”“自动”的宣传页,配着闪烁的蓝色光效和“秒级发现 Bug”的标语…

2026/10/19 4:17:39 阅读更多 →
生产级AI Agent工作流实战:从原型到稳定落地的工程化改造指南

生产级AI Agent工作流实战:从原型到稳定落地的工程化改造指南

带过三个从 Demo 落到线上的 Agent 项目之后,我对“生产级 AI Agent 工作流”这几个字有了完全不同的理解。这个词看上去像是一个技术方案,实际上是一整套关于稳定性、成本、失控风险的系统工程。今天不聊概念,直接讲我是怎么把一条“能用就行…

2026/10/19 4:17:39 阅读更多 →
函数精讲:从定义到递归的全解析

函数精讲:从定义到递归的全解析

, 在第五天的学习笔记中(函数)这个主题是关于函数的问题, 函数可以让代码得到复用, 函数可以接受参数, 函数可以返回结果, 函数可以进行递归操作, 函数还可以是匿名的。一、函数基础这一部分的内容, 第一点就是去搞清楚一个事情, 究竟为什么要使用函数。…

2026/10/19 4:17:39 阅读更多 →
Java Web停车场系统:毕设级可运行项目解析与改造指南

Java Web停车场系统:毕设级可运行项目解析与改造指南

简介:本资源是一套完整的Java Web停车场管理系统毕业设计项目,面向计算机专业本科生及Java初学者,解决校园或中小型商业场景下车位管理、车主信息登记与停车流程数字化等实际问题。压缩包共含源码、数据库脚本、开题报告论文文档及操作视频说…

2026/10/19 4:17:39 阅读更多 →
YOLO26 ONNX后处理实战:从DFL解码到性能优化

YOLO26 ONNX后处理实战:从DFL解码到性能优化

做推理部署的工程师大概率都遇到过这个场景:模型在 PyTorch 里跑得挺正常,一导出 ONNX、换到 ONNX Runtime 或者端侧推理引擎之后,出来的结果就开始“群魔乱舞”——要么框的位置偏得离谱,要么置信度全是负数,要么直接…

2026/10/19 4:16:39 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →