将字符串ID转换为唯一的Guid(或从md5转换为Guid)?

问题描述 投票:0回答:2

我想创建一个系统来转换现有的ID(整数ID或自定义字符串ID)

我想创建一个从任何int,long或string值生成Guid的辅助方法或扩展方法。这个想法是要更新数据库,但要对我的旧数据库进行一些跟踪。每次我转换字符串ID(例如“ O-2019-10-15”)时,系统都会生成相同的唯一Guid。让我们在这里关注字符串。

    public static Guid GenerateGuid(string input)
    {
        // Convertion
        byte[] _byteIds = Encoding.UTF8.GetBytes(input);

        //What about using MD5?
        MD5CryptoServiceProvider _md5 = new MD5CryptoServiceProvider();
        byte[] _checksum = _md5.ComputeHash(_byteIds);

        // Convert ?
        string part1 = /* ??? */;
        string part2 = /* ??? */;
        string part3 = /* ??? */;
        string part4 = /* ??? */;
        string part5 = /* ??? */;

        //Concat these 4 part into one string
        return Guid.Parse("{0}-{1}-{2}-{3}-{4}", part1, part2, part3, part4, part5);
    }

您怎么看? md5是正确的开始吗? Guid()表示中有任何规则吗?

md5的想法是,我可以将所有内容转换为16字节的签名。从那里,我只需要将其转换为Guid()。但我不知道有关Guid的详细信息。是否存在任何规则或保留位置以存储任何数据或其他信息?

c# algorithm md5 guid
2个回答
2
投票

我不会那样做。

我将Guid.NewGuid()用于新ID,然后将旧ID放在旁边(或放在转换表中。)>

下次我需要新的ID时,我将寻找旧的ID,并查看是否已经有了它的向导。


如果不建议保留一个ID非常重要,我不建议将其作为$"{guid}+{oldid}"


0
投票

就目前而言,我是这样做的>>

Guid GenerateGuid(string input)
{
    byte[] _byteIds = Encoding.UTF8.GetBytes(input);

    MD5CryptoServiceProvider _md5 = new MD5CryptoServiceProvider();
    byte[] _checksum = _md5.ComputeHash(_byteIds);

    //Convert checksum into 4 ulong parts and use BASE36 to encode both
    string part1 = BitConverter.ToString(_checksum, 0, 4).Replace("-", string.Empty);
    string part2 = BitConverter.ToString(_checksum, 4, 2).Replace("-", string.Empty);
    string part3 = BitConverter.ToString(_checksum, 6, 2).Replace("-", string.Empty);
    string part4 = BitConverter.ToString(_checksum, 8, 2).Replace("-", string.Empty);
    string part5 = BitConverter.ToString(_checksum, 10, 6).Replace("-", string.Empty);

    return Guid.Parse($"{part1}-{part2}-{part3}-{part4}-{part5}");
}
© www.soinside.com 2019 - 2024. All rights reserved.