ASP.NET Core 中使用 Sqids 实现url短链接编码
haoteby 2025-10-08 17:08 13 浏览
Sqids(发音为 "squids")是一个小型库,用于将数字生成类似URL地址中的 ID。它可以将像 127 这样的数字编码成像 yc3 这样的字符串,你也可以将这些字符串解码回原始数字。当你希望将数字(例如连续的数字 ID)转换为看起来随机的字符串,以便用于 URL 或其他地方时,Sqids 就非常有用。
安装
dotnet add package Sqids
使用
你只需要创建一个 SqidsEncoder 实例即可。 这是该库的主要类,负责编码(encode)和解码(decode)操作。使用无参数的构造函数可以用默认配置初始化 SqidsEncoder。
如果你使用的是 .NET 7 或更高版本:你需要指定一个整数类型作为泛型参数给 SqidsEncoder,最常见的是 int:
using Sqids;
var sqids = new SqidsEncoder<int>;
说明:你可以使用任何整数类型(如 long、byte、short 等)作为类型参数。虽然 int 是最常用的,但如果你需要编码/解码更大的数字,可以使用 long 或 ulong 等。
如果你使用的是 .NET 7 以下的旧框架:SqidsEncoder 仅支持 int 类型,不需要指定泛型类型参数,用法如下:
var sqids = new SqidsEncoder;
示例:编码/解码单个数字:
var id = sqids.Encode(1); // 返回 "Uk"
var number = sqids.Decode(id).Single; // 返回 1
编码/解码多个数字:
var id = sqids.Encode(1,2,3); // 返回 "86Rf07"
var numbers = sqids.Decode(id); // 返回 [1, 2, 3]
注意:Sqids 在对多个数字进行编码/解码时,会保留原始顺序。
自定义功能(Customizations)
你可以通过将一个 SqidsOptions 实例传递给 SqidsEncoder 的构造函数,轻松自定义以下内容:
编码时使用的字符集(Alphabet)
ID 的最小长度(MinLength)
禁用词(不希望出现在 ID 中的词语)黑名单(BlockList)
只需设置你想要的属性,未设置的属性将自动使用默认值。
自定义字符集(Custom Alphabet)
你可以传入一个自定义(最好是打乱顺序的)字符集供 Sqids 用于编码 ID:
var sqids = new SqidsEncoder<int>(new
{
// 默认字符集(小写字母、大写字母、数字)的打乱版本
Alphabet = "mTHivO7hx3RAbr1f586SwjNnK2lgpcUVuG09BCtekZdJ4DYFPaWoMLQEsXIqyz",
});
推荐:即便你想使用默认的字符集,也建议将其打乱,以确保生成的 ID 对你来说是“独一无二”的。 注意:字符集最少要包含 3 个字符。
设置最小长度(Minimum Length)
默认情况下,Sqids 会用尽可能少的字符编码数字。但你可以通过 MinLength 选项设置 ID 的最小长度,例如出于美观考虑:
var sqids = new SqidsEncoder<int>(new
{
MinLength =5,
});
自定义黑名单(BlockList)
var sqids = new SqidsEncoder<int>(new
{
BlockList = { "whatever", "else", "you", "want" },
});
Sqids 内置了一个庞大的默认黑名单,确保不会在 ID 中出现常见的脏话或敏感词。你可以在此基础上添加自己的词:
var sqids = new SqidsEncoder<int>(new
{
BlockList = { "whatever", "else", "you", "want" },
});
注意:上面的代码省略了 new 关键字,这是合法的 C#,它表示将这些词追加到默认黑名单,而不是完全替换。如果你希望完全替换黑名单,可以使用 new { ... }。
依赖注入(Dependency Injection)
你可以将 SqidsEncoder 注册为 DI 容器中的单例服务:
使用默认配置:
services.AddSingleton<SqidsEncoder<int>>;
使用自定义配置:
services.AddSingleton(new SqidsEncoder<int>(new
{
Alphabet = "ABCEDFGHIJ0123456789",
MinLength =6,
}));
然后在任何需要的地方注入使用:
public class SomeController(SqidsEncoder<int> sqids)
{
// 使用 sqids 进行编码解码
}
Demo
总结
源代码地址
https://github.com/bingbing-gui/AspNetCore-Skill/tree/master/src/10-Third-Party/Sqids/Sqlids.AspNetCore
Sqids 是一个简单易用的库,可以帮助你将数字转换为看起来随机的字符串,反之亦然。通过自定义选项,你可以灵活地调整编码和解码的行为,以满足特定需求。无论是在 URL 中使用,还是在其他场景中,Sqids 都能为你提供便利。
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- k8s 证书问题排查_k8s dashboard 证书
-
从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...
- 企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战
-
企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...
- OpenV** Server/Client配置文件详解
-
Server配置详解...
- 接口基础认知:关键信息与合规前提
-
1.核心技术参数(必记)...
- S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)
-
说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...
- SSL证书如何去除私钥密码保护_ssl证书怎么取消
-
有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...
- SSL证书基础知识与自签名证书生成指南
-
一、证书文件类型解析...
- S交换机通过SSH登录设备配置示例(RADIUS认证)
-
说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- HTTPS TLS握手流程_进行tls握手
-
1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....
- Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt
-
SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...
- 源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- 微信支付商户API证书到期 怎么更换
-
微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...