如何获得一个字符串的唯一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

如何获得一个字符串的唯一ID,并从这个ID的字符串与c#

我推荐的一个解决方案是使用散列函数和字典之类的东西。因此,获取输入字符串的哈希值-例如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),它不会以任何方式加密字符串,但我相信它符合您的要求。