您的位置:首页 > 产品设计 > UI/UE

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

2013-11-30 12:53 393 查看
转自 【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字符串有类似“补零”的操作?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: