Base62编码生成6位不重复短码的背后设计

【加解密与C】Base系列(七)Base62 Base62 是一种将数字转换为由 62 个字符组成的字符串的编码方式。它通常用于缩短数字表示,同时避免特殊字符或混淆字符(如0和O0-9A-Z和a-z。 阅读详情

01 引言

短码(Short Code)是指将长 ID、URL 或业务主键压缩为短字符串的编码方案,广泛应用于短链生成、邀请码、订单号、兑换码、分享码等场景。

短码的生成即简单又复杂,简单的是很容易实现,但是要支持高并发场景就不那么容易了。

02 常见的方案

实现的技术方案也不少,我们一起来看看。

2.1 随机生成 + 查重

这种方案是最简单的,但是效率也低。效率低下的原因在于查重。

Set<String> codes = new HashSet<>();

@Test
void contextLoads05() {
    String enableCode = "";
    for (int i = 0; i < 100; i++) {
        String code = RandomUtil.randomString(6);
        System.out.println(code);
        if (!codes.contains(code)) {
            codes.add(code);
            enableCode = code;
            break;
        }
    }
    if (StringUtils.isBlank(enableCode)) {
        throw new RuntimeException("Failed to generate enable code");
    }
    System.out.println(enableCode);
}

Set集合正式使用时可以替换为Redis等其他高性能的中间件。而查询时一个自旋的过程,保证不重复。

测试了一下,如果自选超过10w次,重复的概率就会大幅度提高:

当然这种情况在并发较少的场景下,很容易满足。

2.2 UUID哈希截取

UUID可以做到不重复,但是长度却有点长,不适合作为短码。于是有人提出使用Hash截取的方式。

@Test
void contextLoads06() throws NoSuchAlgorithmException {
    UUID uuid = UUID.randomUUID();
    // 使用SHA-256算法
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    // 对UUID字符串进行哈希
    byte[] hashBytes = digest.digest(uuid.toString().getBytes(StandardCharsets.UTF_8));

    // 将哈希结果转为16进制字符串
    StringBuilder hexString = new StringBuilder();
    for (byte b : hashBytes) {
        hexString.append(String.format("%02x", b));
    }

    // 截取前10位作为短码
    String shortCode = hexString.substring(0, 6);

    System.out.println("原始UUID: " + uuid);
    System.out.println("短码: " + shortCode);
}

Hash的目的是为了让短码分布更均匀。但碰撞风险依然存在。如果使用还是还需要搭配查重才能保险。

2.3 号段模式+Base62

这是一种极佳的设计短码的方案,这里的号段也可以换成其他数字类型,如Snowflake等。

这种设计方案是将"短码生成"问题转化为"自增 ID 分配"问题,再通过确定性编码映射为短码。特征如下:

  • 短码不需要随机生成,只需要**单射(一一对应)**地把数字 ID 编码为字符串
  • 数字 ID 自增 → Base62 编码 → 6 位字符串
  • 同 ID 必同码,不同 ID 必异码(数学上严格成立)
  • 配合号段模式,避开每次生成都打数据库的性能瓶颈

我们下面将着重分析一下此方案设计。

03 详细设计

号段模式+Base62分为两部分,号段部分和编码部分。

3.1 号段设计

号段的设计可以通过数据库主键自增的特性,一次性生成多个如1000个。然后加载到缓存,分配给业务即可。

Mysql库表设计

我们可以设计号段表:

CREATE TABLE `code_segment` (
    `id`          BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键',
    `biz_type`    VARCHAR(32)  NOT NULL                COMMENT '业务类型(短链/邀请码/订单号)',
    `current_max` BIGINT       NOT NULL DEFAULT 0      COMMENT '当前号段已用最大ID',
    `step`        INT          NOT NULL DEFAULT 1000   COMMENT '每次申请的步长',
    `version`     INT          NOT NULL DEFAULT 0      COMMENT '乐观锁版本号',
    `threshold`   INT          NOT NULL DEFAULT 200    COMMENT '提前加载阈值',
    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_biz_type` (`biz_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短码号段表';

这里需要注意是的current_max, step这两个字段,分别决定了到什么时候生成,生成的时候生成多少。

Redis设计

Redis的设计就非常简单了,本身就是基于内存的且单线程。直接使用incr自增方法即可。

3.2 编码

Base62编码虽然简单,但是使用的时候会发现几个问题

短码长度问题

@Test
void contextLoads03() {
    String string = Base62Util.encode(0);
    String astring = Base62Util.encode(916_132_831);
    System.out.println(string);  // 0
    System.out.println(astring); // ZZZZZ
}

我们发现数字比较小的时候,编码之后短码的长度不够。在 ID >= 62^5(916_132_832),编码后天然 6 位以上。

而7位对应的ID为56_800_235_584L。为保证6位,我们的ID区间应该控制在916_132_832L~56_800_235_583L之间,可以支持500亿+的6位短码。使用的时候是足够了。

短码顺序问题

@Test
void contextLoads03() {
    String string = Base62Util.encode(916_132_832);
    String astring = Base62Util.encode(916_132_833);
    System.out.println(string);  // 100000
    System.out.println(astring); // 100001
}

因为短码具有顺序性,这样的码不安全,可以猜到临近的短码。

这个问题又怎么解决呢?

哈希混淆

混淆的框架也是有现成的,这里介绍一个:org.hashids.Hashids

<dependency>
    <groupId>org.hashids</groupId>
    <artifactId>hashids</artifactId>
    <version>1.0.3</version>
</dependency>

直接来看案例:

@Test
void contextLoads04() {
    Hashids hashids = new Hashids("57yW56iL5pyd6Iqx5aSV5ou+",6);
    System.out.println(hashids.encode(0)); // pVe5Vb
    System.out.println(hashids.encode(1)); // Kjznjw
    System.out.println(hashids.encode(100000000)); //eLenzW 
}

Hashids是基于Base62编码,然后增加了混淆。防止获取临近的Code。

到这里,6位短码的设计生成已经可以告一段落了。

04 小结

短码虽小但是设计并没有那么简单。高并发情况下,还需要考虑流量的情况。比如短链属于都多写少的场景,使用过程中还要限流、缓存雪崩等场景。

短链系统核心:Base62编码原理与工程实践详解 进制转换是计算机科学中最基础的数学工具之一,它将一个数字在不同基数间等价映射。当这种思想应用到URL场景中,就催生了短链系统。短链服务需要把冗长的原始链接压缩成简短、唯一且适合传输的字符串,Base62编码正是实现这一目标的核心机制。它利用10个数字、26个小写字母和26个大写字母共62个字符,通过除基取余法将自增ID直接转换为紧凑短码,彻底避免了哈希截断带来的冲突和随机字符串带来的性能瓶颈。同时,自增ID配合Base62还能实现解码即主键查询,极大提升跳转性能。无论是容量估算、固定位数补位,还是分布式ID 阅读详情

相关推荐

短链接系统从零搭建:原理、代码与抖音短链实战

短链接是互联网中广泛使用的基础技术,它通过将冗长的URL压缩为简短字符串,大幅提升内容在社交平台、短信和二维码中的传播效率。其核心原理基于HTTP重定向机制:服务端为每个长地址分配唯一短码,用户访问短链时服务器返回301或302状态码并跳转至真实地址。从技术价值看,短链不仅缩短了路径长度,还天然形成统一的访问入口,为数据追踪、渠道归因和风控治理提供中间层能力。在实际应用中,短链常与二维码联动用于线下物料投放,也可嵌入内容分发系统实现按端分流。文章以抖音v.douyin.com短链为引,深入拆解了短链系统的关

weixin_33862993的博客 490

Base62编码解码

2.不断除以62,将余数映射为对应的BASE62字符。2.从右到左,每个位置的数值乘以62的相应次方。1.将每个BASE62字符转换回对应的数值。3.将余数逆序排列得到编码结果。1.将输入数据视为一个大整数。3.累加所有结果得到原始数据。

u014644574的博客 625

PHP私域引流系统:活码、短链与分享卡片的工程化实现

私域引流系统本质是用户行为路由中枢,其核心在于活码、短链、分享卡片三者构成的数据流闭环。活码不是静态二维码,而是受状态机驱动的动态跳转路由;短链需解决base62编码冲突与多用户隔离问题,避免全局code碰撞导致权限穿透;分享卡片则要求后端无痕合成,兼顾二维码容错率、字体渲染与防盗链能力。技术价值体现在数据层硬隔离(如code前缀绑定user_id)、路由零硬编码、图片生成脱离前端Canvas依赖。典型应用场景包括教培机构裂变获客、本地商家社群引流及SaaS型多租户私域中台建设。本文基于Laravel+My

weixin_29000991的博客 147

简单总结Base家族

Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足8比特高位补0)串联起来,按照5比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。例如,它用于将图像嵌入到Adobe PDF文件中。Base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。

clotten的博客 4561

base62:一个小型Java库,用于在base-62中对数字和UUID进行编码

Base62库 这是一个小型Java库,用于以base-62格式编码和解码数据。 它主要用于以紧凑且在URL中运行良好的方式对UUID进行编码。 与base-64相比,它不需要任何非字母数字字符。 基本-62系统的62位由10个字符为十进制数字(表示0 ... 9 ),26个大写字母字符( A ... Z ),和26小写字母字符( a ... z )。 base-62编码的64位long要求11个数字(字符),UUID要求22个字符。 该库仅支持对long和UUID值进行编码,以及对长度为11的倍数的字符串进行解码。 用法 该库可通过。 pom.xml < dependency> < groupId>org.unbroken-dome.base62</ groupId> < artifactId>base62</ artifactId> < version

base62:Base62编码器和解码器,用于任意数据

Base62 该库实现base62编码。 除整数外,它还可以编码和解码任意数据。 例如,当生成url安全时,这很有用。 安装 用安装。 $ composer require tuupola/base62 该分支需要PHP 7.1或更高版本。 较早的1.x分支还支持PHP 5.6和7.0。 $ composer require " tuupola/base62:^1.0 " 用法 该软件包具有纯PHP和基于的编码器。 默认情况下,如果安装了扩展名,则编码器和解码器将使用GMP功能。 如果GMP不可用,将使用纯PHP编码器代替。 $ base62 = new Tuupola \ Base62 ; $ encoded = $ base62 -> encode ( random_bytes ( 128 )); $ decoded = $ base62 -> decode ( $ enco

Java Base家族-Base16,Base32,Base62,Base64和Base128

base2: 2进制base10: 10进制base16: 计算机字节表示base32: 字母加数字base64: 更大的表示范围base62: 除去Base64的+和/,短链经常使用此编码base58: bitcoin为了比base64更易读采用的表示,比特币经常使用二、各种编码的介绍2.1 Base16Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码,不区分大小写。Base16 编码表值编码值编码008811992。

精益求精 2072

SpringBoot短链服务实战:从生成到跳转的全链路设计

本文详细介绍了基于SpringBoot构建高可用短链服务的全链路设计与实战经验。内容涵盖短码生成算法(如自增ID+Base62)、数据库表设计、服务层构建(生成与302跳转),并深入探讨了利用Redis缓存、布隆过滤器防穿透、定时清理等高级优化策略,旨在实现一个高并发、高性能的工业级短链系统。

tomato的博客 1002

IFIX数据库Datebase当前值问号

IFIX数据库Datebase当前值问号,已解决,亲测有效 在OPC PowerTool有数据的情况下,IFIX数据库Datebase当前值显示???? 问题分析及解决方法 我的IFIX5.8版本,其它版本可参考 打开IFIX工作台:应用程序–任务控制–I/O驱动–OPC Client;查看OPC驱动是否被禁用,点击启动,变成激活状态即可;若点击启动无法激活OPC驱动,需要重新安装OPC驱动,方法如下: 下载I/O Driver文件 下载链接:https://download.youkuaiyun.com/down

Ron_Tso的博客 2759

从零开始搭建GD32F103CBT6开发环境:VSCode配置与实战技巧

本文详细介绍了如何从零开始为国产MCU GD32F103CBT6搭建高效的VSCode开发环境。内容涵盖工具链安装、VSCode核心插件配置、工程目录结构规划、关键配置文件编写以及Makefile实战,旨在帮助开发者摆脱传统IDE束缚,利用现代化工具链提升嵌入式开发效率。

weixin_29158413的博客 448

随机短码如何生成不重复?从碰撞概率到Base62编码全解析

在业务系统中,邀请码、短链接、兑换码等场景经常需要生成类似“abc439d”的随机短字符串。这类标识符的生成看似简单,实则涉及随机数来源、字符集设计、碰撞概率估算和数据库存储等多重工程问题。基于密码学安全随机数(CSPRNG)与Base62编码原理,开发者可以在可读性与唯一性之间取得平衡。通过熵值计算和生日悖论公式,可以估算不同长度短码在千万级数据量下的碰撞概率,并据此选择6位或8位方案。如需彻底避免碰撞,则可采用“自增ID + Base62编码”的映射方法,同时结合唯一索引应对并发写入。本文从随机短码的核

weixin_29268637的博客 250

森林冰火人html源码,森林冰火人单人版(源码)

【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ...

weixin_42507981的博客 6197

短UID系统设计与实现:从原理到Spring Boot实战

在分布式系统和互联网应用中,用户标识符(UID)是识别用户身份的核心。传统的自增数字ID虽然对机器友好,但存在不易记忆、暴露信息等问题。为解决这些痛点,短UID技术应运而生,其核心原理是通过Base62等编码算法,将长数字ID转换为短字符串,从而提升可读性和传播性。这项技术的价值在于平衡了存储效率与用户体验,广泛应用于个人主页短链接、邀请码、资源标识等场景。本文聚焦于短UID系统的设计与实现,深入探讨了高并发下的唯一性保障和分布式ID生成策略,并结合Spring Boot后端与Redis缓存,提供了一个完整

weixin_34161083的博客 493

偷懒必备:3种方法快速移植MFC界面资源(含.rc文件打不开解决方案)

本文针对MFC桌面应用开发,详细介绍了三种快速移植界面资源的实战方法:直接编辑.rc文件、利用Visual Studio“添加现有项”进行可视化挂载,以及双实例拖拽应急方案。文章重点剖析了.rc文件无法打开的常见问题,提供了通过修复rc.exe等关键文件来根治此问题的解决方案,帮助开发者高效复用资源,规避ID冲突等陷阱。

weixin_28358083的博客 273

uniapp:APP报错Error: Not Found:Page[2][-1,1;-1,1,0,0,2-0] at view.umd.min.js:1(uniApp安卓苹果ios出现一大堆数字错误)

Error: Not Found:Page[2][一串数字] at view.umd.min.js:1,uniapp在APP端运行报错Error: Not Found:Page[2][-1,1;-1,1,0,0,2-0] at view.umd.min.js:1,uniapp真机运行偶尔出现Not Found:Page[2][-1,28] at view.umd.min.js:1,如何解决uniApp app报错:Not found -1,71 at view.umd.min.js:1,uniapp项目在H

✅ 精选推荐文章 3984

字节三面:如何设计一个高性能短链系统?

本文系统梳理了高并发场景下短链系统的设计方案,涵盖需求澄清、短码生成(推荐自增ID+Base62)、存储建模(分库分表+KV加速)、多级缓存(含布隆过滤器防穿透)、一致性处理、高可用架构及限流防刷等核心模块。通过容量估算与代码示例,完整呈现一套可支撑亿级流量、低延迟、可扩展的短链系统设计,强调从业务出发进行权衡与演进,适用于大厂系统设计面试。

油墨香^-^的博客 244

simulink的电动汽车制动系统热管理仿真

本文系统研究了电动汽车制动系统热管理仿真技术。通过建立机电液多物理场耦合模型,分析了不同工况下的动态热平衡特性。提出基于MPC的动态调节和NSGA-II多目标优化算法,使电池温度波动降低60%。创新性采用石墨烯相变材料与微通道液冷复合技术,冷却系统能耗减少40%。研究构建了完整的工程验证平台,涵盖200kW电制动测试台和高精度热成像系统。展望指出,未来将结合Transformer预测和强化学习算法,进一步优化热管理策略。该研究为电动汽车制动系统热管理提供了从理论建模到工程实施的完整解决方案。

xiaoheshang_123的博客 122

雪花算法实战:高并发短链系统的架构设计与优化

短链接服务本质上是一个发号器、映射表与跳转网关的组合,在高并发场景下,唯一ID的生成与防遍历能力是架构设计的核心挑战。本文从分布式ID生成的基本概念出发,剖析标准雪花算法的位结构及其在短链场景下的不足,并提出一种定制化变体——通过压缩时间戳、引入随机种子与位混淆变换,使短码不再呈现单调递增规律,同时保持极高的生成性能。文章结合线上事故案例,详细阐述发号器与存储层如何协作,包括Base62编码、分库分表、两级缓存、时钟回拨兜底、防遍历安全加固等工程实践,并给出压测数据与常见问题排查技巧。这套方案不仅适用于短链

weixin_33585822的博客 88

ConvNeXt 系列改进:二次创新 ConvNeXt:结合 RepVGG 结构重参数化,训练多分支、推理单路

2026年的视觉模型赛道呈现出一种有趣的“返璞归真”趋势——在Transformer狂飙数年之后,卷积网络正以全新的姿态回归。这其中,ConvNeXt无疑是纯卷积阵营中最耀眼的明星。从2022年Meta AI首次提出至今,ConvNeXt系列已经走过了近四年的演进之路,衍生出ConvNeXt V2、E-ConvNeXt等多个增强版本。ConvNeXt的7×7深度卷积带来了不错的感受野,却也埋下了推理效率的隐患。

ZXSXJ的博客 234

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

短随机标识符生成实战:从Base62到防碰撞设计

在分布式系统和用户增长业务中,短随机标识符(Short Random ID)是一种兼顾安全性与可读性的通用技术方案。不同于自增ID的可预测和UUID的冗长,这类短码通常基于密码学安全随机数生成器(CSPRNG)和Base62编码实现,在约10位长度内即可携带近60 bit的随机熵,广泛用于邀请码、优惠券、短链ID及内部工单号等场景。设计时需重点关注随机源的安全性、模偏差消除、碰撞概率边界以及易混淆字符剔除等工程细节。本文从短码的结构原理出发,对比多种生成方案,解析Base62编码与拒绝采样实现,并结合并发入

weixin_31155097的博客 235

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

短UID系统设计:从原理到Spring Boot+Redis分布式发号器实现

在分布式系统架构中,用户标识符(UID)的设计直接影响着系统的扩展性、安全性和用户体验。从基础的自增ID、UUID到雪花算法,每种方案都有其适用场景与权衡。短UID作为一种高信息密度、用户友好的标识符,其核心原理在于通过有限字符集与固定长度组合,在保证全局唯一性的同时提升可读性与传播性。技术价值体现在平衡业务需求与系统性能,常应用于短链接生成、用户自定义用户名、邀请码等需要易记易分享的场景。本文聚焦于短UID的工程实践,详细解析了基于Redis分布式发号器与进制转换的健壮生成方案,并深入探讨了其在并发处理、

weixin_34332905的博客 377

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

从亿级流量到瞬时跳转:短链系统的高性能架构解密

本文深入解析了支撑亿级流量的短链系统高性能架构。面对高并发、低延迟、高可用的核心挑战,文章从短码生成、多级缓存设计、数据库分片、异步削峰、精准限流等维度,系统阐述了如何构建一个能瞬时响应、稳定可靠的工业级短链服务,为应对海量流量提供了实战解决方案。

weixin_29268267的博客 536

Java短ID设计避坑指南:UUID截断为何致命

短ID是分布式系统中高频需求的基础概念,其核心在于平衡唯一性、可读性与性能。原理上,ID生成必须依托高熵源或强序列机制,而非简单字符串截断;技术价值体现在避免碰撞、支撑水平扩展与保障数据一致性。典型应用场景包括设备注册、订单编号和用户标识等前端需简洁展示、后端需强唯一性的业务。然而,将标准UUID暴力截取前8位,实质抛弃了RFC 4122定义的时间戳、版本号与节点熵字段,使碰撞空间骤降至2^32,日增万级ID时第17天冲突概率即超50%。真正可靠的方案应基于号段预分配、Snowflake时钟防护或加密映射—

weixin_34210740的博客 377

短链系统设计:高并发场景下的架构核心与面试要点解析

在分布式系统与高并发架构设计中,URL重定向与数据映射是基础且关键的技术环节。其核心原理在于通过唯一的短标识符映射到原始的长资源地址,实现流量的高效引导与数据管理。这一技术的工程价值在于,它能以极低的存储与计算成本,支撑海量的瞬时访问请求,是构建高可用、可扩展互联网服务的基石。典型的应用场景包括社交媒体分享、营销推广链路追踪以及内容防爬等,这些场景都要求系统具备极高的读吞吐量和毫秒级响应延迟。本文以短链系统这一经典模型为例,深入剖析如何运用分布式ID生成、多级缓存策略、读写分离架构以及异步处理等手段,来应对

weixin_33947521的博客 438

从零设计高可用短链系统:架构、核心算法与工程实践

短链系统是互联网中一项基础且关键的服务,其核心原理是通过一个简短的唯一标识符(短码)映射到原始的长URL,从而实现链接的压缩与重定向。从技术实现上看,其核心挑战在于如何高效、唯一地生成短码,并保证映射关系在海量请求下的快速查询与高可用。这通常涉及哈希算法、发号器、进制转换等核心算法,并结合缓存、数据库等存储技术来构建高性能的读写服务。其技术价值在于,它不仅优化了用户体验和传播效率,更是流量追踪、数据分析和安全管控的重要基础设施。典型的应用场景包括社交媒体分享、营销短信、二维码推广等。本文将以一个高可用、高性

weixin_34295316的博客 368
上一篇: Spring I18N 底层源码大揭秘:你的 MessageSource 到底是怎么找到配置的?
下一篇: Spring Boot 4.0 + gRPC 极简集成:4步搞定,比REST还丝滑
智_永无止境
博客等级 码龄10年 803粉丝 404原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值