使用Base64编码来缩短GUID字符串

来源:互联网 发布:鲁大师 硬件体检 优化 编辑:程序博客网 时间:2024/04/30 11:57

转自 【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字符串有类似“补零”的操作?

 

原创粉丝点击