如何获得一个字符串的唯一ID,并从这个ID的字符串与c#
本文关键字:字符串 ID 何获得 一个 唯一 | 更新日期: 2023-09-27 17:53:22
我有这个名字:
string name = "Centos 64 bit";
我想从这个名称生成一个168位(或任何可行的)uid,并且能够从这个id获得名称,反之亦然.我尝试了这个GetHashCode()没有成功。
结果类似于:
Centos 64位(=)91C47A57-E605-4902-894B-74E791F37C1F
我推荐的一个解决方案是使用散列函数和字典之类的东西。因此,获取输入字符串的哈希值-例如SHA256 -并将其截断为168字节。
现在,要从uid返回到原始字符串,您需要有一个字典来存储像(input_string, string_uid)这样的对。Input_string是原始字符串,string_uid是使用第一段中的方法为Input_string生成的uid。
使用这个字典,您可以使用string_uid轻松地返回到原始输入字符串。
这是一种方法-当然,在这种情况下,您可以存储字符串和uid之间的映射。
散列通常以字节数组的形式给出结果。将字节数组转换为字符串是一个单独的步骤。
例如,如果你有10个字节表示[0,255]范围内的整数,如果你将字节数组编码为十六进制字符串,将其转换为字符串,将需要20个字节。
下一个问题是你想要uid字符串的长度是21字节吗?
因为这将意味着哈希输出必须在10字节左右,这将很差地反映输出的抗碰撞性。
你想要的是无法实现的。您需要存储一个查找表的散列来命名。因为你没有给出系统的更多细节,所以很难说它是持久化的还是存储在内存中。如果在内存中使用string->string
给您,先生:
public byte[] GetUID(string name)
{
var bytes = Encoding.ASCII.GetBytes(name);
if (bytes.Length > 21)
throw new ArgumentException("Value is too long to be used as an ID");
var uid = new byte[21];
Buffer.BlockCopy(bytes, 0, uid, 0, bytes.Length);
return bytes;
}
public string GetName(byte[] UID)
{
int length = UID.Length;
for (int i = 0; i < UID.Length; i++)
{
if (UID[i] == 0)
{
length = i;
break;
}
}
return Encoding.ASCII.GetString(UID, 0, length);
}
注意事项:它适用于长度不超过21个字符的字符串,只使用ASCII字符(不支持Unicode),它不会以任何方式加密字符串,但我相信它符合您的要求。