我有一个实体表,每个实体都有一个 ID 标识列,它是一个简单的递增整数,保证每个实体都是唯一的。 如何从这些身份整数创建相对较短(最好是 10 个字符或更少)的 slugs,以便每个整数应映射到集合中唯一的随机字符系列
[a-z][0-9]
? 换句话说,从技术上讲,创建作为实体的字符串表示形式的 slugs 是微不足道的:/foobar/1
、/foobar/2
等,但是如何基于这些看起来更像 /foobar/34a4804bc9
的身份整数创建 slugs, /foobar/291e407998
等等?
int id = 0;
Random r = new Random(id);
char[] chars = "abcdefghijklmnopqrstuvwxyz1234567890".ToCharArray();
string output = "";
for (int i = 0; i < 10; i++)
{
output += chars[r.Next(chars.Length)];
}
Console.WriteLine(output);
可能是最简单的方法。将 ID 替换为他们的唯一编号,它充当种子。
为像我一样偶然发现这篇文章的其他人添加此内容。我发现一个名为 Sqids(以前称为 Hashids)的开源库正是这样做的。
快速编码和解码示例:
var sqids = new SqidsEncoder<int>();
var id = sqids.Encode(1, 2, 3); // "86Rf07"
var numbers = sqids.Decode(id); // [1, 2, 3]
如果ID太短,可以将其填充到一定长度:
var sqids = new SqidsEncoder<int>(new()
{
MinLength = 10,
});
var id = sqids.Encode(1, 2, 3); // "86Rf07xd4z"
var numbers = sqids.Decode(id); // [1, 2, 3]