Sqids 在 .NET 中生成安全短 ID

B站影视 内地电影 2025-05-30 08:31 2

摘要:Sqids是一个用于将数字编码为短且唯一的非顺序字符串的库,支持在 .NET 平台中使用。适用于生成用户可见的 ID(如 URL 中的 ID),确保这些 ID 不包含敏感或不适当的内容,并提供高性能和灵活性。

Sqids是一个用于将数字编码为短且唯一的非顺序字符串的库,支持在 .NET 平台中使用。适用于生成用户可见的 ID(如 URL 中的 ID),确保这些 ID 不包含敏感或不适当的内容,并提供高性能和灵活性。

有点类似之前介绍的 · Hashids· 生成的短链

使用Hashids来保护你的Dotnet应用程序

无冲突(Collision-free):生成的 ID 是唯一的,并能解码回原始数字。

多数字支持(Multiple Numbers):支持将多个数字编码为一个 ID,并可准确还原。

“眼安全”(Eye-safe):避免常见脏话、敏感词,适合用户可见场景。

随机化输出(Randomized Output):相同输入序列会生成不同 ID,防止猜测。

支持所有整数类型:包括intlongbyte等。

高性能(Blazingly Fast):基于 Span 实现,内存分配少,性能高。

全面测试(Meticulously Tested):覆盖大量边界情况,稳定可靠。

CLS 兼容:支持多种 .NET 语言(如 C#、F#)。

使用 NuGet Package ManagerInstall-Package Sqidsusing Sqids;

var sqids = new SqidsEncoderint>;注意:.NET 7 及以上版本需指定泛型类型参数,如;旧版本直接使用new SqidsEncoder单个数字编码/解码var id = sqids.Encode(1); // 输出类似 "Uk"
var number = sqids.Decode(id).Single; // 返回 [1]多个数字编码/解码var id = sqids.Encode(123); // 输出类似 "86Rf07"
var numbers = sqids.Decode(id); // 返回 [1, 2, 3]

你可以自定义以下内容:

自定义字母表(Alphabet)var sqids = new SqidsEncoderint>(new
{
Alphabet = "mTHivO7hx3RAbr1f586SwjNnK2lgpcUVuG09BCtekZdJ4DYFPaWoMLQEsXIqyz",
});

建议使用打乱后的字符集以增强唯一性。

最小长度(MinLength)var sqids = new SqidsEncoderint>(new
{
MinLength =5
});自定义屏蔽词(BlockList)var sqids = new SqidsEncoderint>(new
{
BlockList = { "whatever", "else", "you", "want" },
});

默认屏蔽词已经非常全面,你也可以添加额外项进行扩展。

解码单个数字if (sqids.decode(input) is [var singleNumber])
{
// 使用 singleNumber
}检查 ID 是否为规范格式(Canonical)var decoded = sqids.Decode(incomingId);
boolisCanonical = incomingId == sqids.Encode(decoded);

结合单个数字检查:

if (sqids.Decode(incomingId) is [var decodedId] && incomingId == sqids.Encode(decodedId))
{
// 合法且规范
}
else
{
// 非法请求,返回 404 或其他处理
}默认配置services.AddSingletonint>>;自定义配置services.AddSingleton(new SqidsEncoderint>(new
{
Alphabet = "ABCEDFGHIJ0123456789",
MinLength =6
}));

在控制器中注入:

public class SomeController(SqidsEncoderint> sqids)
{
// ...
}

Sqids提供了一种简洁、高效的方式来生成安全、美观的短 ID,特别适合用于对外暴露的资源标识符。它不仅易于集成,还具备高度定制能力,是现代 .NET 应用程序中理想的 ID 编码解决方案。

来源:opendotnet

相关推荐