转自 【Chris】
有时候我们会使用GUID来作为数据库的主键,但是我觉得GUID字符串实在有点儿长,最近发现一种方法可以使GUID变短——变短了还是GUID吗?实际上这个变短是“变身”,尽管外貌变了,内心还是没有变的嘛。
Base64通常表示一种计算机编码方式,在电子邮件传输中经常可以看到。我的理解是Base64编码是一种使用“常规”字符集来表示二进制数据的方式,与其他BaseXX的编码方式一样,通常用N个字符来表示一个字节的数据。
那Base64和GUID有什么关系呢?其实没什么关系,只是通过将GUID进行Base64编码之后可以缩短GUID的长度。我想Base64编码之后的GUID就是GUID二进制的字符表现形式。
public static string Shrink(this Guid target) { Check.Argument.IsNotEmpty(target, "target"); string base64 = Convert.ToBase64String(target.ToByteArray()); string encoded = base64.Replace("/", "_").Replace("+", "-"); return encoded.Substring(0, 22); }
通过上面的函数可以将一个GUID转变为一个长度为22的字符串。并且这种转换是可逆的:
public static Guid ToGuid(this string target) { Guid result = Guid.Empty; if ((!string.IsNullOrEmpty(target)) && (target.Trim().Length == 22)) { string encoded = string.Concat(target.Trim().Replace("-", "+").Replace("_", "/"), "=="); try { byte[] base64 = Convert.FromBase64String(encoded); result = new Guid(base64); } catch(FormatException) { } } return result; }
通过上面的函数可以将一个Base64编码过的字符串转回GUID。
当然应该是可逆,否则电子邮件通过Base64编码之后不能转换回来,麻烦就大啦,哈哈。
GUID长度为16位,128比特,Base64一个字符表示6比特,因此base64编码之后的字符串会比GUID的字符串短。不过我不知道为什么GUID的字符串会有那么长?可能32位字符有些是“补零”吧?要知道,如果将字符串编码为Base64字符串,长度会增加——而上面的函数不是编码“字符串”而是直接编码“二进制数组”。这似乎也说明了GUID字符串有类似“补零”的操作?