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 及以上版本需指定泛型类型参数,如 ;旧版本直接使用 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]

自定义配置
你可以自定义以下内容:

自定义字母表(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 编码解决方案。

文档更新时间: 2025-05-31 08:07   作者:admin