C# 实现短网址核心逻辑与进制压缩转换

苏见山
苏见山
发布时间:2026-10-14| 3人浏览过
原创

短网址系统通过“长链接转短链”及“短链跳转回长链”的机制节省展示空间。其核心在于建立唯一的 ID 映射与数据库存储,并利用62进制算法将数字 ID 压缩为包含字母的短字符串,从而实现更简洁的 URL 结构。

短网址的基本原理

短网址的作用类似于超市购物时的储物柜:用户存入长链接(物品),系统生成一个唯一的编号(号码牌)。后续访问该短链接时,服务器根据编号找到对应的原始长链接,并通过 HTTP 重定向将用户引导至目标地址。这一过程对终端用户透明,主要目的是缩短链接视觉长度并便于统计点击数据。

系统架构与数据存储

实现一个基础的短网址服务,关键在于维护长 URL 与短标识之间的映射关系。最简单的结构设计只需包含以下两个核心要素:

  1. 数据库表结构:通常只需要两个字段。一个是自增主键 ID(或作为唯一索引的字段),另一个是存储原始长 URL 的文本字段。为了支持并发和高效查询,可在短标识字段上建立唯一索引。
  2. 核心操作流程:
  • 创建:接收长 URL -> 写入数据库 -> 获取新产生的自增 ID。
  • 解析/跳转:接收短标识 -> 在数据库中查找对应的长 URL -> 返回 HTTP 301 或 302 重定向响应。

ID 进制压缩:从十进制到62进制

如果直接使用数据库自增的十进制 ID(如 10086)作为短链后缀,随着数据量增长,URL 依然会变长。为了进一步压缩显示长度,业界通用做法是使用 62进制 编码。即利用 a-z(小写)、A-Z(大写)和 0-9(数字),共 62 个字符来表示数值。

例如,十进制的 10086 经过62进制转换后变为 2CG,不仅长度更短,且具有不可预测性。以下是使用 C# 实现的62进制压缩(正序)与还原(逆序)的具体代码逻辑:

using System;

public class ShortUrlConverter
{
    // 定义62进制字符集:0-9, a-z, A-Z
    private const string Number = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    /// <summary>
    /// 将十进制长整型 ID 压缩为 62进制短字符串
    /// </summary>
    /// <param name="n">原始长整型ID</param>
    /// <returns>压缩后的短字符串</returns>
    public static string Compress(long n)
    {
        if (n == 0) return Number[0].ToString();

        string result = string.Empty;
        int l = Number.Length; // 62

        while (n / l >= 1)
        {
            // 取余数并映射到字符,拼接到结果前方
            result = Number[(int)(n % l)] + result;
            n /= l;
        }
        result = Number[(int)n] + result;
        return result;
    }

    /// <summary>
    /// 将 62进制短字符串还原为十进制长整型 ID
    /// </summary>
    /// <param name="s">压缩后的短字符串</param>
    /// <returns>还原后的长整型ID</returns>
    public static long UnCompress(string s)
    {
        long result = 0;
        if (string.IsNullOrEmpty(s)) return 0;

        s = s.Trim();
        int l = s.Length;
        int m = Number.Length; // 基数 62

        for (int x = 0; x < l; x++)
        {
            // 从后往前计算权重:当前位字符在字符集中的索引 * (基数的x次方)
            int index = Number.IndexOf(s[l - 1 - x]);
            if (index != -1)
            {
                result += index * (long)Math.Pow(m, x);
            }
        }
        return result;
    }
}

参数说明与使用注意事项

  • 字符集顺序:Number 字符串的顺序必须严格一致,压缩和解压时必须保持相同顺序。常见的顺序有 0-9,a-z,A-Z 或 a-z,A-Z,0-9。
  • 性能优化:上述代码中的 Math.Pow 在频繁调用时可能会有微小性能损耗,对于极高并发场景,可预先计算 Math.Pow(62, x) 的结果并缓存,或使用位运算优化(针对2的幂次进制),但在常规业务中直接计算即可满足需求。
  • 异常处理:在实际生产环境中,应确保输入的短字符串仅包含定义的合法字符,避免 IndexOf 返回 -1 导致计算错误。

实际效果评估

使用62进制算法后,URL 的长度被显著压缩。以常见的短网址域名(如 http://example.com/)为例:

  • 未压缩前:基于十进制 ID 10086,生成 http://example.com/10086(7位字符)。
  • 压缩后:ID 10086 转换为 2CG,生成 http://example.com/2CG(3位字符)。

随着 ID 值的增大,压缩优势越明显。例如 ID 达到千万级时,十进制需要 7-8 位,而62进制仅需 4-5 位,有效提升了链接的可读性和传播效率。

以上就是 C# 实现短网址核心逻辑与进制压缩转换的详细内容,更多关于 C# 后端开发与算法优化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。