我想创建一个系统来转换现有的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的详细信息。是否存在任何规则或保留位置以存储任何数据或其他信息?
我不会那样做。
我将Guid.NewGuid()
用于新ID,然后将旧ID放在旁边(或放在转换表中。)>
下次我需要新的ID时,我将寻找旧的ID,并查看是否已经有了它的向导。
如果不建议保留一个ID非常重要,我不建议将其作为$"{guid}+{oldid}"
。
就目前而言,我是这样做的>>
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}");
}