c# - 从自然数生成 5 个长度的唯一代码
问题描述
我需要用给定的数字生成一个长度为 5 的唯一代码。换句话说,我需要将自然数编码为 5 长度的唯一代码
我想给客户提供固定长度的可记忆代码,并将序列号保留在数据库中,并在需要时进行编码或解码。
给定的数字可以在 1 到 9999999 的范围内。但结果总是必须是 5 个长度。
例如
1 => a56er 或 2 => c7gh4
唯一性很重要我用谷歌搜索了很多,但找不到解决方案。
解决方案
给定的数字可以在 1 到 9999999 的范围内
正确的。因此,您需要对 24 位信息进行编码,并且您有 5 个字符可以执行此操作——因此每个字符需要 5 位。这在“仅数字和小写 ASCII 字符”的范围内令人愉快,您甚至可以消除诸如“o/0”和“i/1”之类的混淆点。
请注意,这绝不是“安全的”——它是完全可预测和可逆的。如果您不希望客户能够从编码形式对他们的序列号进行逆向工程,那将是行不通的。但这是一种将数字编码为固定长度字符串的简单方法。
显示编码和解码的示例代码:
using System;
using System.Globalization;
public class Test
{
static void Main()
{
EncodeDecode(10);
EncodeDecode(100);
EncodeDecode(1000);
EncodeDecode(10000);
EncodeDecode(100000);
EncodeDecode(1000000);
EncodeDecode(9999999);
void EncodeDecode(int number)
{
string encoded = EncodeBase32(number);
int decoded = DecodeBase32(encoded);
Console.WriteLine($"{number} => {encoded} => {decoded}");
}
}
private const string Base32Alphabet =
"23456789abcdefghjklmnpqrstuvwxyz";
private static string EncodeBase32(int number)
{
// TODO: Range validation
char[] chars = new char[5];
for (int i = 0; i < 5; i++)
{
chars[i] = Base32Alphabet[number & 0x1f];
number = number >> 5;
}
return new string(chars);
}
private static int DecodeBase32(string text)
{
if (text.Length != 5)
{
throw new ArgumentException("Invalid input: wrong length");
}
int number = 0;
for (int i = 4; i >= 0; i--)
{
number = number << 5;
int index = Base32Alphabet.IndexOf(text[i]);
if (index == -1)
{
throw new ArgumentException("Invalid input: invalid character");
}
number |= index;
}
return number;
}
}
输出:
10 => c2222 => 10
100 => 65222 => 100
1000 => az222 => 1000
10000 => jsb22 => 10000
100000 => 2p352 => 100000
1000000 => 2ljy2 => 1000000
9999999 => zm7kb => 9999999
推荐阅读
- c# - NumericUpDown DataBinding 属性在值更改时不更新
- html - 图像设置为适合“祖父母”但隐藏在“父母”内
- android - 使用类别注册广播接收器
- javascript - JavaScript: element.setAttribute(attribute,value) , element.attribute=value & element.[attribute]=value 不改变属性值
- java - Java项目中的信任边界冲突漏洞
- dask - dask-jobqueue 不会在 slurm 集群上启动任何工作程序
- mysql - MySQL JOIN 查询崩溃
- python - 从 Pandas DataFrame 创建 NetworkX 图
- twitter-bootstrap - 同一行中的两个输入,与其他输入不同的填充
- python-3.x - Aws Programmatic 启动批处理作业