https://mp.weixin.qq.com/s/o6sRVg-mT7Lxbd4uq1tg6w
Sqids 是一个用于将数字编码为短且唯一的非顺序字符串的库,支持在 .NET 平台中使用。适用于生成用户可见的 ID(如 URL 中的 ID),确保这些 ID 不包含敏感或不适当的内容,并提供高性能和灵活性。
有点类似之前介绍的 · Hashids· 生成的短链
使用Hashids来保护你的Dotnet应用程序
功能特性
• 无冲突(Collision-free): 生成的 ID 是唯一的,并能解码回原始数字。
• 多数字支持(Multiple Numbers): 支持将多个数字编码为一个 ID,并可准确还原。
• “眼安全”(Eye-safe): 避免常见脏话、敏感词,适合用户可见场景。
• 随机化输出(Randomized Output): 相同输入序列会生成不同 ID,防止猜测。
• 支持所有整数类型: 包括 int、long、byte 等。
• 高性能(Blazingly Fast): 基于 Span 实现,内存分配少,性能高。
• 全面测试(Meticulously Tested): 覆盖大量边界情况,稳定可靠。
• CLS 兼容: 支持多种 .NET 语言(如 C#、F#)。
安装方法
你可以通过 NuGet 安装 Sqids:
使用 NuGet Package Manager
Install-Package Sqids
快速入门
引入命名空间并创建编码器实例:
using Sqids;
var sqids = new SqidsEncoder<int>();
注意:.NET 7 及以上版本需指定泛型类型参数,如
单个数字编码/解码
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]
自定义配置
你可以自定义以下内容:
自定义字母表(Alphabet)
var sqids = new SqidsEncoder<int>(new()
{
Alphabet = "mTHivO7hx3RAbr1f586SwjNnK2lgpcUVuG09BCtekZdJ4DYFPaWoMLQEsXIqyz",
});
建议使用打乱后的字符集以增强唯一性。
最小长度(MinLength)
var sqids = new SqidsEncoder<int>(new()
{
MinLength = 5,
});
自定义屏蔽词(BlockList)
var sqids = new SqidsEncoder<int>(new()
{
BlockList = { "whatever", "else", "you", "want" },
});
默认屏蔽词已经非常全面,你也可以添加额外项进行扩展。
高级用法
解码单个数字
if (sqids.Decode(input) is [var singleNumber])
{
// 使用 singleNumber
}
检查 ID 是否为规范格式(Canonical)
var decoded = sqids.Decode(incomingId);
bool isCanonical = incomingId == sqids.Encode(decoded);
结合单个数字检查:
if (sqids.Decode(incomingId) is [var decodedId] && incomingId == sqids.Encode(decodedId))
{
// 合法且规范
}
else
{
// 非法请求,返回 404 或其他处理
}
在依赖注入中使用
注册服务:
默认配置
services.AddSingleton<SqidsEncoder<int>>();
自定义配置
services.AddSingleton(new SqidsEncoder<int>(new()
{
Alphabet = "ABCEDFGHIJ0123456789",
MinLength = 6,
}));
在控制器中注入:
public class SomeController(SqidsEncoder<int> sqids)
{
// ...
}
总结
Sqids 提供了一种简洁、高效的方式来生成安全、美观的短 ID,特别适合用于对外暴露的资源标识符。它不仅易于集成,还具备高度定制能力,是现代 .NET 应用程序中理想的 ID 编码解决方案。