Hashids 是一个用于生成类似 YouTube 视频 ID 的短字符串的 .NET 包。它将数字如 347
转换为字符串如 yr8
,或数字数组如 [27, 986]
转换为 3kTMd
。你也可以将这些 ID 解码回原始数字。这在将多个参数捆绑在一起、隐藏实际 ID 或仅使用它们作为短字符串 ID 方面非常有用。
特点
• 从整数创建短的、唯一的 ID。《(仅限正数和零)》
• 生成非顺序 ID,以保持输入递增时的不可猜测性。
• 支持单个数字或数字数组。《(支持
int
和long
)》• 支持自定义字母表和盐 — 因此 ID 对你的应用程序是唯一的。《(盐必须小于字母表)》
• 支持最小哈希长度。
• 尽量避开基本的英语粗话。
注意事项
• 这不是真正的加密哈希,因为它是可逆的。
• 仅支持零和正整数。负数将不会被编码。
• 只能指定最小哈希长度。没有办法在最大哈希长度内适应任意数字。
• 字母表必须包含至少 16 个独特的字符,并且是区分大小写的。
• 分隔符是用于在哈希中编码多个数字的字符,也必须在字母表中。
• 盐必须小于可用字母表,并且限于
alphabet - separators - 1
的长度。
安装
使用 [NuGet][] 安装包
Install-Package hashids.net
使用
导入命名空间
using HashidsNet;
对一个数字进行编码
你可以传递一个独特的盐值,以便你的哈希与其他人的不同。我使用 "this is my salt" 作为示例。
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(12345);
hash
现在是:
NkK9
如果你的 ID 存储为 Int64
,你需要使用 "EncodeLong"。
var hashids = new Hashids("this is my salt");
var hash = hashids.EncodeLong(666555444333222L);
hash
现在是:
KVO9yy1oO5j
解码
注意在解码期间,使用相同的盐值:
var hashids = new Hashids("this is my salt");
numbers = hashids.Decode("NkK9");
numbers
现在是:
[ 12345 ]
var hashids = new Hashids("this is my salt");
numbers = hashids.DecodeLong("KVO9yy1oO5j");
numbers
现在是:
[ 666555444333222L ]
解码单个 ID
默认情况下,Decode 和 DecodeLong 将返回一个数组。如果你需要解码单个 ID,你可以使用以下辅助函数:
var hashids = new Hashids("this is my pepper");
number = hashids.DecodeSingle("NkK9");
number
现在是:
12345
var hashids = new Hashids("this is my pepper");
if (hashids.TryDecodeSingle("NkK9", out int number)) { // 解码哈希成功。 }
number
现在是:
12345
你可以处理异常以查看解码出了什么问题:
var hashids = new Hashids("this is my pepper");
try
{
number = hashids.DecodeSingle("NkK9");
}
catch (NoResultException) { // 解码提供的哈希没有产生任何结果。 }
number
现在是:
12345
var hashids = new Hashids("this is my pepper");
number = hashids.DecodeSingleLong("KVO9yy1oO5j");
number
现在是:
666555444333222L
var hashids = new Hashids("this is my pepper");
if (hashids.TryDecodeSingleLong("NkK9", out long number)) { // 解码哈希成功。 }
number
现在是:
666555444333222L
var hashids = new Hashids("this is my pepper");
try
{
number = hashids.DecodeSingleLong("KVO9yy1oO5j");
}
catch (NoResultException) { // 解码提供的哈希没有产生任何结果。 }
number
现在是:
666555444333222L
使用不同盐解码
如果盐变了,解码将无法工作:
var hashids = new Hashids("this is my pepper");
numbers = hashids.Decode("NkK9");
numbers
现在是:
[]
编码多个数字
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(683, 94108, 123, 5);
hash
现在是:
aBMswoO2UB3Sj
解码以相同的方式完成
var hashids = new Hashids("this is my salt");
var numbers = hashids.Decode("aBMswoO2UB3Sj")
numbers
现在是:
[ 683, 94108, 123, 5 ]
编码并指定最小哈希长度
这里我们对整数 1 进行编码,并设置最小哈希长度为 8(默认为 0 -- 这意味着哈希将是尽可能短的长度)。
var hashids = new Hashids("this is my salt", 8);
var hash = hashids.Encode(1);
hash
现在是:
gB0NV05e
解码
var hashids = new Hashids("this is my salt", 8);
var numbers = hashids.Decode("gB0NV05e");
numbers
现在是:
[ 1 ]
指定自定义哈希字母表
这里我们将字母表设置为由:"abcdefghijkABCDEFGHIJK12345" 组成
var hashids = new Hashids("this is my salt", 0, "abcdefghijkABCDEFGHIJK12345")
var hash = hashids.Encode(1, 2, 3, 4, 5)
hash
现在是:
Ec4iEHeF3
随机性
hashids 的主要用途是混淆 ID。它不是为安全目的或压缩而设计或测试的。话虽如此,这个算法确实试图使这些哈希不可猜测和不可预测:
重复数字
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(5, 5, 5, 5);
你在哈希中看不到任何重复的模式,可能显示有 4 个相同的数字:
1Wc8cwcE
同样适用于递增数字:
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
hash
将是:
kRHnurhptKcjIDTWC3sx
递增数字哈希:
var hashids = new Hashids("this is my salt");
hashids.Encode(1); // => NV
hashids.Encode(2); // => 6m
hashids.Encode(3); // => yD
hashids.Encode(4); // => 2l
hashids.Encode(5); // => rD
使用 HEX 字符串编码
var hashids = new Hashids("this is my salt");
var hash = hashids.EncodeHex("DEADBEEF");
hash
现在是:
kRNrpKlJ
解码为 HEX 字符串
var hashids = new Hashids("this is my salt");
var hex = hashids.DecodeHex("kRNrpKlJ");
hex
现在是:
DEADBEEF