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

时间:2023-01-11 12:23:39

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